public StreamSocket(Communicator communicator, INetworkProxy?proxy, EndPoint addr, IPAddress?sourceAddr) { _communicator = communicator; _proxy = proxy; _addr = addr; _sourceAddr = sourceAddr; _fd = Network.CreateSocket(false, (_proxy != null ? _proxy.GetAddress() : _addr).AddressFamily); _state = StateNeedConnect; Network.SetBlock(_fd, false); Network.SetTcpBufSize(_fd, _communicator); _readEventArgs = new SocketAsyncEventArgs(); _readEventArgs.Completed += new EventHandler <SocketAsyncEventArgs>(IoCompleted); _writeEventArgs = new SocketAsyncEventArgs(); _writeEventArgs.Completed += new EventHandler <SocketAsyncEventArgs>(IoCompleted); // // For timeouts to work properly, we need to receive/send // the data in several chunks. Otherwise, we would only be // notified when all the data is received/written. The // connection timeout could easily be triggered when // receiving/sending large frames. // _maxSendPacketSize = Math.Max(512, Network.GetSendBufferSize(_fd)); _maxRecvPacketSize = Math.Max(512, Network.GetRecvBufferSize(_fd)); }
// // Only for use by UdpConnector. // internal UdpTransceiver(Communicator communicator, string transport, EndPoint addr, IPAddress?sourceAddr, string mcastInterface, int mcastTtl) { _communicator = communicator; Transport = transport; _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; } }
internal TcpTransceiver(Communicator communicator, EndPoint addr, INetworkProxy?proxy, IPAddress?sourceAddr) { _communicator = communicator; _proxy = proxy; _addr = addr; _desc = ""; _sourceAddr = sourceAddr; Socket = Network.CreateSocket(false, (_proxy != null ? _proxy.Address : _addr).AddressFamily); try { Network.SetBufSize(Socket, _communicator, Transport.TCP); } catch (Exception) { Socket.CloseNoThrow(); throw; } }
// Only for use by UdpConnector. internal UdpSocket( Communicator communicator, IConnector connector, EndPoint addr, IPAddress?sourceAddr, string?multicastInterface, int multicastTtl) { _communicator = communicator; _connector = connector; _addr = (IPEndPoint)addr; _multicastInterface = multicastInterface; _incoming = false; if (sourceAddr != null) { _sourceAddr = new IPEndPoint(sourceAddr, 0); } Socket = Network.CreateSocket(true, _addr.AddressFamily, _connector); try { Network.SetBufSize(Socket, _communicator, Transport.UDP); _rcvSize = (int)Socket.GetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveBuffer) !; _sndSize = (int)Socket.GetSocketOption(SocketOptionLevel.Socket, SocketOptionName.SendBuffer) !; if (Network.IsMulticast(_addr)) { if (_multicastInterface != null) { Debug.Assert(_multicastInterface.Length > 0); Network.SetMulticastInterface(Socket, _multicastInterface, _addr.AddressFamily); } if (multicastTtl != -1) { Network.SetMulticastTtl(Socket, multicastTtl, _addr.AddressFamily); } } } catch (SocketException ex) { Socket.CloseNoThrow(); throw new TransportException(ex, RetryPolicy.NoRetry, _connector); } }