예제 #1
0
        // 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);
            }
        }