예제 #1
0
        public Socket ConnectTCPSocket(IPAddressList addr, int port)
        {
#if UNITTEST
            return(ConnectTCPSocket(addr, port, 3000));
#else
            return(ConnectTCPSocket(addr, port, _ConsoleLog.ProtocolOptions.SocketConnectTimeout));
#endif
        }
예제 #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((ITerminalParameter)_tcpDestination);
                //_client.SuccessfullyExit(this.Result);
            }
            catch (Exception ex) {
                if (!_interrupted)
                {
                    RuntimeUtil.DebuggerReportException(ex);
                    if (!_overridingErrorMessage)
                    {
                        _errorMessage = ex.Message;
                    }
                    ////ProtocolUtil.FireConnectionFailure((ITerminalParameter)_tcpDestination, _errorMessage);
                    //_client.ConnectionFailed(_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();
                    if (_NetUtil != null)
                    {
                        _NetUtil = null;
                    }
                }
            }
        }
예제 #3
0
        protected virtual void MakeConnection()
        {
            //‚Ü‚¸SOCKS‚ðŽg‚¤‚ׂ«‚©‚Ç‚¤‚©‚ð”»’è‚·‚é
            IProtocolOptions opt = new ProtocolOptions(""); // 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("Message.AddressNotResolved", dest));
                _addressSet = new IPAddressList(dest);
                EndOverridingErrorMessage();
            }

            StartOverridingErrorMessage(String.Format("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;
        }
예제 #4
0
        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])) //‚PŒÂ‚¾‚¯‚Å”»’fA‚â‚₳‚Ú‚è
                {
                    return(false);
                }
            }
            return(true);
        }
예제 #5
0
 public 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);        //ˆê‚Â‚Å‚à¬Œ÷‚·‚ê‚΂»‚ê‚ðŽg‚¤
             }
         }
         catch (Exception ex) {
             if (_ConsoleLog != null)
             {
                 _ConsoleLog.NetLog(ex.Message);
             }
         }
     }
     throw new Exception(String.Format("Message.FailedToConnectAddress", addrlist.AvailableAddresses[0].ToString()));
 }