示例#1
0
        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);
            }
        }
示例#2
0
        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();
            }
        }