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 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; }
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); }
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())); }
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; }