public Endpoint Bind() { Debug.Assert(_fd != null); if (Network.IsMulticast((IPEndPoint)_addr)) { Network.SetReuseAddress(_fd, true); _mcastAddr = (IPEndPoint)_addr; if (AssemblyUtil.IsWindows) { // // Windows does not allow binding to the mcast address itself // so we bind to INADDR_ANY (0.0.0.0) instead. As a result, // bi-directional connection won't work because the source // address won't the multicast address and the client will // therefore reject the datagram. // if (_addr.AddressFamily == AddressFamily.InterNetwork) { _addr = new IPEndPoint(IPAddress.Any, _port); } else { _addr = new IPEndPoint(IPAddress.IPv6Any, _port); } } _addr = Network.DoBind(_fd, _addr); if (_port == 0) { _mcastAddr.Port = ((IPEndPoint)_addr).Port; } Debug.Assert(_mcastInterface != null); Network.SetMcastGroup(_fd, _mcastAddr.Address, _mcastInterface); } else { _addr = Network.DoBind(_fd, _addr); } _bound = true; Debug.Assert(_endpoint != null); _endpoint = _endpoint.Endpoint(this); return(_endpoint); }