コード例 #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);
            }
        }
コード例 #2
0
ファイル: TCP_Listen.cs プロジェクト: radtek/SharpSocks
        /// <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);
            }
        }