Пример #1
0
        /// <summary>
        /// 客户端接收数据回调
        /// </summary>
        /// <param name="ar"></param>
        private void TCP_Client_Receive(IAsyncResult ar)
        {
            try
            {
                byte[] Data = DataHandle.De_Bytes(Client_Data.Take(Client_Stream.EndRead(ar)).ToArray());

                if (Data.Length > 0)
                {
                    TCP_Socks_Send(Proxy_Stream, Data);
                    Client_Stream.BeginRead(Client_Data, 0, Data_Size, TCP_Client_Receive, null);
                }
                else
                {
                    close();
                }
            }
            catch
            {
                close();
            }
        }
Пример #2
0
        /// <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);
            }
        }