/// <summary> /// 读取回调 /// </summary> /// <param name="ar"></param> private void TCP_Receive(IAsyncResult ar) { var State_Vt = (((TcpClient Tcp_Client, NetworkStream TCP_Stream))ar.AsyncState); try { byte[] Data = DataHandle.De_Bytes(Receive_Data.Take(State_Vt.TCP_Stream.EndRead(ar)).ToArray()); if (Data.Length > 0) { byte[] Methods = DataHandle.Get_Checking_Method(Data); int Data_Type = DataHandle.Get_Which_Type(Data); //请求建立连接 if (Methods.Contains((byte)0)) { TCP_Send(State_Vt.Tcp_Client, DataHandle.No_Authentication_Required); State_Vt.TCP_Stream.BeginRead(Receive_Data, 0, Data_Size, new AsyncCallback(TCP_Receive), State_Vt); } //接受代理目标端信息 else if (1 < Data_Type && Data_Type < 8) { var Request_Info = DataHandle.Get_Request_Info(Data); if (Request_Info.type == 1) { //TCP TcpClient Tcp_Proxy = DataHandle.Connecte_TCP(Request_Info.IP, Request_Info.port); if (Tcp_Proxy.Connected) { new TCP_Server(State_Vt.Tcp_Client, Tcp_Proxy); TCP_Send(State_Vt.Tcp_Client, DataHandle.Proxy_Success); } else { TCP_Send(State_Vt.Tcp_Client, DataHandle.Connect_Fail); throw (new SocketException()); } } else if (Request_Info.type == 3) { //UDP //判断是否开启UDP支持及UDP阈值 if (UDP_Support && UDP_Listen.Surplus_Proxy_Count > 0) { //得到客户端开放UDP端口 IPEndPoint ClientPoint = new IPEndPoint((State_Vt.Tcp_Client.Client.RemoteEndPoint as IPEndPoint).Address, Request_Info.port); UDP_Listener.Add_Server(ClientPoint, State_Vt.Tcp_Client); byte[] header = DataHandle.Get_UDP_Header(State_Vt.Tcp_Client.Client.LocalEndPoint as IPEndPoint); TCP_Send(State_Vt.Tcp_Client, header); } else { throw (new SocketException()); } } } else { throw (new SocketException()); } } else { throw (new SocketException()); } } catch (Exception) { Close(State_Vt.Tcp_Client); } }