public Socket ConnectTCPSocket(IPAddressList addr, int port) { #if UNITTEST return(ConnectTCPSocket(addr, port, 3000)); #else return(ConnectTCPSocket(addr, port, _ConsoleLog.ProtocolOptions.SocketConnectTimeout)); #endif }
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; } } } }
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); //ʼn‚©‚çIPƒAƒhƒŒƒXŒ`Ž®‚Ì‚Æ‚«‚ÍŽè‚Å•ÏŠ·B‚»‚¤‚Å‚È‚¢‚ÆDNS‚Ì‹tˆø‚«‚ð‚µ‚Äƒ^ƒCƒ€ƒAƒEƒgA‚Æ‚©‚â‚₱‚µ‚¢‚±‚Æ‚ª‹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; }
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ŒÂ‚¾‚¯‚Å”»’fA‚â‚₳‚Ú‚è { return(false); } } return(true); }
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())); }