void OnCompleted(object sender, SocketAsyncEventArgs e) { try { byte[] request = Req.GetData(); if (e.SocketError != SocketError.Success) { request[1] = (byte)SocksError.Unreachable; } else { request[1] = 0x00; } Client.Client.Send(request); switch (e.LastOperation) { case SocketAsyncOperation.Connect: //connected; _tcpTunnel = new TcpTunnel(Client.Client, RemoteClient); _tcpTunnel.Start(); break; } } finally { e.Completed -= OnCompleted; e.RemoteEndPoint = null; Sockets.ConnectSaeaPool.Add(e); } }
public void Open() { if (Req.Address == null || Req.Port <= -1) { Client.Client.Disconnect(); return; } var socketArgs = Sockets.ConnectSaeaPool.Take(); socketArgs.RemoteEndPoint = new IPEndPoint(Req.IP, Req.Port); socketArgs.Completed += OnCompleted; RemoteClient.Sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); if (!RemoteClient.Sock.ConnectAsync(socketArgs)) { _tcpTunnel = new TcpTunnel(Client.Client, RemoteClient); _tcpTunnel.Start(); } }