예제 #1
0
        /// <summary>
        /// 读取回调
        /// </summary>
        /// <param name="ar"></param>
        private void Socks_Receive(IAsyncResult ar)
        {
            var State_Vt = (((TcpClient Tcp_Client, NetworkStream TCP_Stream))ar.AsyncState);

            try
            {
                int size = State_Vt.TCP_Stream.EndRead(ar);
                if (size > 0)
                {
                    Program.PrintLog(string.Format("收到客户端的{0}个字节数据", size));
                    byte[] Methods   = dataHandle.Get_Checking_Method(Receive_Data.Take(size).ToArray());
                    int    Data_Type = dataHandle.Get_Which_Type(Receive_Data.Take(size).ToArray());
                    //请求建立连接

                    if (Methods.Contains((byte)0))
                    {
                        Socks_Send(State_Vt.Tcp_Client, dataHandle.No_Authentication_Required);
                        Program.PrintLog("等待接受代理目标信息");
                        State_Vt.TCP_Stream.BeginRead(Receive_Data, 0, Data_Size, new AsyncCallback(Socks_Receive), State_Vt);
                    }
                    //接受代理目标端信息
                    else if (2 < Data_Type && Data_Type < 6)
                    {
                        var       Request_Info = dataHandle.Get_Request_Info(Receive_Data.Take(size).ToArray());
                        TcpClient Tcp_Proxy    = dataHandle.Connecte_Tcp(Request_Info.type, Request_Info.IP, Request_Info.port);
                        if (Tcp_Proxy.Connected)
                        {
                            new Socks_Server(State_Vt.Tcp_Client, Tcp_Proxy);
                            Socks_Send(State_Vt.Tcp_Client, dataHandle.Proxy_Success);
                            Program.PrintLog("正式建立开启代理");
                        }
                        else
                        {
                            Socks_Send(State_Vt.Tcp_Client, dataHandle.Connect_Fail);
                            Close(State_Vt.Tcp_Client);
                        }
                    }
                }
                else
                {
                    Close(State_Vt.Tcp_Client);
                }
            }
            catch (Exception)
            {
                Close(State_Vt.Tcp_Client);
            }
        }