Example #1
0
        public static Socket ConnectTCPSocket(IPAddressList addr, int port)
        {
#if UNITTEST
            return(ConnectTCPSocket(addr, port, 3000));
#else
            return(ConnectTCPSocket(addr, port, PEnv.Options.SocketConnectTimeout));
#endif
        }
Example #2
0
        private void Run()
        {
            _tcpConnected = false;
            _succeeded    = false;
            _socket       = null;

            try
            {
                _addressSet   = null;
                _errorMessage = null;
                MakeConnection();
                Debug.Assert(_socket != null);

                _errorMessage = null;
                Negotiate();

                _succeeded = true;
                ProtocolUtil.FireConnectionSucceeded(_tcpDestination);
            }
            catch (Exception ex)
            {
                if (!_interrupted)
                {
                    RuntimeUtil.DebuggerReportException(ex);
                    if (!_overridingErrorMessage)
                    {
                        _errorMessage = ex.Message;
                    }
                    ProtocolUtil.FireConnectionFailure(_tcpDestination, _errorMessage);
                }
            }
            finally
            {
                if (!_interrupted)
                {
                    if (!_succeeded && _socket != null && _socket.Connected)
                    {
                        try
                        {
                            _socket.Shutdown(SocketShutdown.Both);                             //Close()だと非同期受信してる場所で即Exceptionになってしまう
                        }
                        catch (Exception ex)
                        {                         //ここでちゃんと閉じることが出来ない場合があった
                            RuntimeUtil.SilentReportException(ex);
                        }
                    }
                    //ここで待機していたスレッドが動き出すので、その前にSocketのDisconnectはやっつけておく。同時につついたせいかソケットの動作が妙になったケースあり。
                    NotifyAsyncClient();
                }
            }
        }
        protected virtual void MakeConnection()
        {
            //まずSOCKSを使うべきかどうかを判定する
            IProtocolOptions opt = ProtocolsPlugin.Instance.ProtocolOptions;

            if (opt.UseSocks && SocksApplicapable(opt.SocksNANetworks, IPAddressList.SilentGetAddress(_host)))
            {
                _socks            = new Socks();
                _socks.Account    = opt.SocksAccount;
                _socks.Password   = opt.SocksPassword;
                _socks.DestName   = _host;
                _socks.DestPort   = (short)_port;
                _socks.ServerName = opt.SocksServer;
                _socks.ServerPort = (short)opt.SocksPort;
            }

            string dest = _socks == null ? _host : _socks.ServerName;
            int    port = _socks == null ? _port : _socks.ServerPort;

            IPAddress address = null;

            if (IPAddress.TryParse(dest, out address))
            {
                _addressSet = new IPAddressList(address); //最初からIPアドレス形式のときは手で変換。そうでないとDNSの逆引きをしてタイムアウト、とかややこしいことが起こる
            }
            else                                          //ホスト名形式
            {
                StartOverridingErrorMessage(String.Format(PEnv.Strings.GetString("Message.AddressNotResolved"), dest));
                _addressSet = new IPAddressList(dest);
                EndOverridingErrorMessage();
            }

            StartOverridingErrorMessage(String.Format(PEnv.Strings.GetString("Message.FailedToConnectPort"), dest, port));
            _socket = NetUtil.ConnectTCPSocket(_addressSet, port);
            EndOverridingErrorMessage();
            _connectedAddress = ((IPEndPoint)_socket.RemoteEndPoint).Address;

            if (_socks != null)
            {
                _errorMessage = "An error occurred in SOCKS negotiation.";
                _socks.Connect(_socket);
                //接続成功したら_host,_portを元に戻す
                _host = _socks.DestName;
                _port = _socks.DestPort;
            }

            _tcpConnected = true;
        }
Example #4
0
 public static Socket ConnectTCPSocket(IPAddressList addrlist, int port, int timeout)
 {
     foreach (IPAddress addr in addrlist.AvailableAddresses)
     {
         try {
             Socket s = ConnectTCPSocket(addr, port, timeout);
             if (s != null)
             {
                 return(s); //一つでも成功すればそれを使う
             }
         }
         catch (Exception ex) {
             ProtocolsPlugin.Instance.NetLog(ex.Message);
         }
     }
     throw new Exception(String.Format(PEnv.Strings.GetString("Message.FailedToConnectAddress"), addrlist.AvailableAddresses[0].ToString()));
 }
        private static bool SocksApplicapable(string nss, IPAddressList address)
        {
            foreach (string netaddress in nss.Split(';'))
            {
                if (netaddress.Length == 0)
                {
                    continue;
                }

                if (!NetAddressUtil.IsNetworkAddress(netaddress))
                {
                    throw new FormatException(String.Format("{0} is not suitable as a network address.", netaddress));
                }
                if (address.AvailableAddresses.Length > 0 && NetAddressUtil.NetAddressIncludesIPAddress(netaddress, address.AvailableAddresses[0])) //1個だけで判断、ややさぼり
                {
                    return(false);
                }
            }
            return(true);
        }
        private void Run() {
            _tcpConnected = false;
            _succeeded = false;
            _socket = null;

            try {
                _addressSet = null;
                _errorMessage = null;
                MakeConnection();
                Debug.Assert(_socket != null);

                _errorMessage = null;
                Negotiate();

                _succeeded = true;
                ProtocolUtil.FireConnectionSucceeded(_tcpDestination);
            }
            catch (Exception ex) {
                if (!_interrupted) {
                    RuntimeUtil.DebuggerReportException(ex);
                    if (!_overridingErrorMessage) {
                        _errorMessage = ex.Message;
                    }
                    ProtocolUtil.FireConnectionFailure(_tcpDestination, _errorMessage);
                }
            }
            finally {
                if (!_interrupted) {
                    if (!_succeeded && _socket != null && _socket.Connected) {
                        try {
                            _socket.Shutdown(SocketShutdown.Both); //Close()だと非同期受信してる場所で即Exceptionになってしまう
                        }
                        catch (Exception ex) { //ここでちゃんと閉じることが出来ない場合があった
                            RuntimeUtil.SilentReportException(ex);
                        }
                    }
                    //ここで待機していたスレッドが動き出すので、その前にSocketのDisconnectはやっつけておく。同時につついたせいかソケットの動作が妙になったケースあり。
                    NotifyAsyncClient();
                }
            }
        }
Example #7
0
 public static Socket ConnectTCPSocket(IPAddressList addrlist, int port, int timeout)
 {
     foreach (IPAddress addr in addrlist.AvailableAddresses) {
         try {
             Socket s = ConnectTCPSocket(addr, port, timeout);
             if (s != null)
                 return s; //一つでも成功すればそれを使う
         }
         catch (Exception ex) {
             ProtocolsPlugin.Instance.NetLog(ex.Message);
         }
     }
     throw new Exception(String.Format(PEnv.Strings.GetString("Message.FailedToConnectAddress"), addrlist.AvailableAddresses[0].ToString()));
 }
Example #8
0
 public static Socket ConnectTCPSocket(IPAddressList addr, int port)
 {
     #if UNITTEST
     return ConnectTCPSocket(addr, port, 3000);
     #else
     return ConnectTCPSocket(addr, port, PEnv.Options.SocketConnectTimeout);
     #endif
 }
        private static bool SocksApplicapable(string nss, IPAddressList address)
        {
            foreach (string netaddress in nss.Split(';')) {
                if (netaddress.Length == 0)
                    continue;

                if (!NetAddressUtil.IsNetworkAddress(netaddress)) {
                    throw new FormatException(String.Format("{0} is not suitable as a network address.", netaddress));
                }
                if (address.AvailableAddresses.Length > 0 && NetAddressUtil.NetAddressIncludesIPAddress(netaddress, address.AvailableAddresses[0])) //1個だけで判断、ややさぼり
                    return false;
            }
            return true;
        }
        protected virtual void MakeConnection()
        {
            //まずSOCKSを使うべきかどうかを判定する
            IProtocolOptions opt = ProtocolsPlugin.Instance.ProtocolOptions;
            if (opt.UseSocks && SocksApplicapable(opt.SocksNANetworks, IPAddressList.SilentGetAddress(_host))) {
                _socks = new Socks();
                _socks.Account = opt.SocksAccount;
                _socks.Password = opt.SocksPassword;
                _socks.DestName = _host;
                _socks.DestPort = (short)_port;
                _socks.ServerName = opt.SocksServer;
                _socks.ServerPort = (short)opt.SocksPort;
            }

            string dest = _socks == null ? _host : _socks.ServerName;
            int port = _socks == null ? _port : _socks.ServerPort;

            IPAddress address = null;
            if (IPAddress.TryParse(dest, out address)) {
                _addressSet = new IPAddressList(address); //最初からIPアドレス形式のときは手で変換。そうでないとDNSの逆引きをしてタイムアウト、とかややこしいことが起こる
            }
            else { //ホスト名形式
                StartOverridingErrorMessage(String.Format(PEnv.Strings.GetString("Message.AddressNotResolved"), dest));
                _addressSet = new IPAddressList(dest);
                EndOverridingErrorMessage();
            }

            StartOverridingErrorMessage(String.Format(PEnv.Strings.GetString("Message.FailedToConnectPort"), dest, port));
            _socket = NetUtil.ConnectTCPSocket(_addressSet, port);
            EndOverridingErrorMessage();
            _connectedAddress = ((IPEndPoint)_socket.RemoteEndPoint).Address;

            if (_socks != null) {
                _errorMessage = "An error occurred in SOCKS negotiation.";
                _socks.Connect(_socket);
                //接続成功したら_host,_portを元に戻す
                _host = _socks.DestName;
                _port = _socks.DestPort;
            }

            _tcpConnected = true;
        }
        private void Run()
        {
            _tcpConnected = false;
            _succeeded = false;
            _socket = null;

            try {
                _addressSet = null;
                _errorMessage = null;
                MakeConnection();
                Debug.Assert(_socket != null);

                _errorMessage = null;
                Negotiate();

                _succeeded = true;
                ProtocolUtil.FireConnectionSucceeded(_tcpDestination);
            }
            catch (Exception ex) {
                if (!_interrupted) {
                    RuntimeUtil.DebuggerReportException(ex);
                    if (!_overridingErrorMessage) {
                        _errorMessage = ex.Message;
                    }
                    ProtocolUtil.FireConnectionFailure(_tcpDestination, _errorMessage);
                }
            }
            finally {
                if (!_interrupted) {
                    if (!_succeeded && _socket != null && _socket.Connected) {
                        try {
                            _socket.Shutdown(SocketShutdown.Both); //Close()���Ɣ񓯊���M���Ă�ꏊ�ő�Exception�ɂȂ��Ă��܂�
                        }
                        catch (Exception ex) { //�����ł����ƕ‚��邱�Ƃ��o���Ȃ��ꍇ��������
                            RuntimeUtil.SilentReportException(ex);
                        }
                    }
                    //�����őҋ@���Ă����X���b�h�������o���̂ŁA���̑O��Socket��Disconnect�͂���‚��Ă����B�����ɂ‚‚����������\�P�b�g�̓��삪���ɂȂ����P�[�X����B
                    NotifyAsyncClient();
                }
            }
        }
        protected virtual void MakeConnection()
        {
            //�܂�SOCKS��g���ׂ����ǂ����𔻒肷��
            IProtocolOptions opt = ProtocolsPlugin.Instance.ProtocolOptions;
            if (opt.UseSocks && SocksApplicapable(opt.SocksNANetworks, IPAddressList.SilentGetAddress(_host))) {
                _socks = new Socks();
                _socks.Account = opt.SocksAccount;
                _socks.Password = opt.SocksPassword;
                _socks.DestName = _host;
                _socks.DestPort = (short)_port;
                _socks.ServerName = opt.SocksServer;
                _socks.ServerPort = (short)opt.SocksPort;
            }

            string dest = _socks == null ? _host : _socks.ServerName;
            int port = _socks == null ? _port : _socks.ServerPort;

            IPAddress address = null;
            if (IPAddress.TryParse(dest, out address)) {
                _addressSet = new IPAddressList(address); //�ŏ�����IP�A�h���X�`���̂Ƃ��͎�ŕϊ��B�����łȂ���DNS�̋t��������ă^�C���A�E�g�A�Ƃ���₱�������Ƃ��N����
            }
            else { //�z�X�g���`��
                StartOverridingErrorMessage(String.Format(PEnv.Strings.GetString("Message.AddressNotResolved"), dest));
                _addressSet = new IPAddressList(dest);
                EndOverridingErrorMessage();
            }

            StartOverridingErrorMessage(String.Format(PEnv.Strings.GetString("Message.FailedToConnectPort"), dest, port));
            _socket = NetUtil.ConnectTCPSocket(_addressSet, port);
            EndOverridingErrorMessage();
            _connectedAddress = ((IPEndPoint)_socket.RemoteEndPoint).Address;

            if (_socks != null) {
                _errorMessage = "An error occurred in SOCKS negotiation.";
                _socks.Connect(_socket);
                //�ڑ�����������_host,_port����ɖ߂�
                _host = _socks.DestName;
                _port = _socks.DestPort;
            }

            _tcpConnected = true;
        }