// // Only for use by UdpConnector. // internal UdpTransceiver(TransportInstance instance, EndPoint addr, IPAddress?sourceAddr, string mcastInterface, int mcastTtl) { _instance = instance; _addr = addr; if (sourceAddr != null) { _sourceAddr = new IPEndPoint(sourceAddr, 0); } _readEventArgs = new SocketAsyncEventArgs(); _readEventArgs.RemoteEndPoint = _addr; _readEventArgs.Completed += new EventHandler <SocketAsyncEventArgs>(IoCompleted); _writeEventArgs = new SocketAsyncEventArgs(); _writeEventArgs.RemoteEndPoint = _addr; _writeEventArgs.Completed += new EventHandler <SocketAsyncEventArgs>(IoCompleted); _mcastInterface = mcastInterface; _state = StateNeedConnect; _incoming = false; try { _fd = Network.CreateSocket(true, _addr.AddressFamily); SetBufSize(-1, -1); Network.SetBlock(_fd, false); if (Network.IsMulticast((IPEndPoint)_addr)) { if (_mcastInterface.Length > 0) { Network.SetMcastInterface(_fd, _mcastInterface, _addr.AddressFamily); } if (mcastTtl != -1) { Network.SetMcastTtl(_fd, mcastTtl, _addr.AddressFamily); } } } catch (System.Exception) { _fd = null; throw; } }
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); }