private static void HandleClient(Socket socket2Client)
        {
            lock (clients) {
                while (clients.Count > Conf.maxClientsCount)
                {
                    Tunnel tunnel2Close = clients.Dequeue();
                    tunnel2Close.Close();
                }
            }
            Thread threadHandleClient = new Thread(_handleClient);

            threadHandleClient.IsBackground = true;
            threadHandleClient.Start(socket2Client);
        }
Esempio n. 2
0
        private static void handleClient(Socket socket2Client, int ipepIndex)
        {
            Tunnel tunnel2Add = new Tunnel(socket2Client, null, Conf.encryptionKey);
            bool   result     = RequestHandler.Handle(tunnel2Add);

            if (result)
            {
                tunnel2Add.Flow();
            }
            else
            {
                tunnel2Add.Close();
            }
            reqGotNumbers.Down();
        }
        private static bool CreateTunnel(out Tunnel tunnel)
        {
            bool   succeed = false;
            Tunnel result  = new Tunnel(null, null, Conf.encryptionKey);

            succeed = Connect2Relayer(result);
            if (succeed)
            {
                tunnel = result;
            }
            else
            {
                result.Close();
                tunnel = null;
            }
            return(succeed);
        }
        private static Tunnel HandleTCPReq(byte[] request, Socket socket2Client)
        {
            Tunnel result = null;

            if (request != null && socket2Client != null)
            {
                IPAddress ip   = GetIP(request);
                int       port = GetPort(request);
                if (ip != null && port != 0)
                {
                    IPEndPoint      reqIPEP = new IPEndPoint(ip, port);
                    string          reply;
                    EagleTunnelArgs e = new EagleTunnelArgs();
                    e.EndPoint = reqIPEP;
                    result     = EagleTunnelSender.Handle(
                        EagleTunnelHandler.EagleTunnelRequestType.TCP, e);
                    if (result != null)
                    {
                        reply = "\u0005\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000";
                    }
                    else
                    {
                        reply = "\u0005\u0001\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000";
                    }
                    byte[] buffer = Encoding.ASCII.GetBytes(reply);
                    int    written;
                    try {
                        written = socket2Client.Send(buffer);
                    } catch { written = 0; }
                    if (result != null)
                    {
                        if (written > 0)
                        {
                            result.SocketL = socket2Client;
                        }
                        else
                        {
                            result.Close();
                            result = null;
                        }
                    }
                }
            }
            return(result);
        }
Esempio n. 5
0
        public static Tunnel Handle(
            string firstMsg, System.Net.Sockets.Socket socket2Client)
        {
            Tunnel result = null;

            if (firstMsg != null && socket2Client != null)
            {
                if (HTTPReqArgs.TryParse(firstMsg, out HTTPReqArgs e0))
                {
                    IPEndPoint      reqEP = HTTPReqArgs.GetIPEndPoint(e0);
                    EagleTunnelArgs e1    = new EagleTunnelArgs();
                    e1.EndPoint = reqEP;
                    Tunnel tunnel = EagleTunnelSender.Handle(
                        EagleTunnelHandler.EagleTunnelRequestType.TCP, e1);
                    if (tunnel != null)
                    {
                        tunnel.SocketL = socket2Client;
                        bool done;
                        if (e0.HTTP_Request_Type == HTTPRequestType.CONNECT)
                        {
                            // HTTPS: reply web client;
                            string re443 = "HTTP/1.1 200 Connection Established\r\n\r\n";
                            done = tunnel.WriteL(re443);
                        }
                        else
                        {
                            // HTTP: relay new request to web server
                            string newReq = HTTPReqArgs.CreateNewRequest(firstMsg);
                            done = tunnel.WriteR(newReq);
                        }
                        if (done)
                        {
                            result = tunnel;
                        }
                        else
                        {
                            tunnel.Close();
                        }
                    }
                }
            }
            return(result);
        }
Esempio n. 6
0
        public static Tunnel Handle(EagleTunnelHandler.EagleTunnelRequestType type, EagleTunnelArgs e)
        {
            Tunnel result = null;

            if (type != EagleTunnelHandler.EagleTunnelRequestType.Unknown &&
                e != null)
            {
                IPEndPoint ipeOfServer   = Conf.GetRemoteIPEndPoint();
                Socket     socket2Server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                try {
                    socket2Server.Connect(ipeOfServer);
                } catch { socket2Server = null; }
                Tunnel tunnel = CheckVersion(socket2Server);
                if (tunnel != null)
                {
                    bool done = CheckUser(tunnel);
                    if (done)
                    {
                        switch (type)
                        {
                        case EagleTunnelHandler.EagleTunnelRequestType.DNS:
                            DNSReqSender(tunnel, e);
                            done = false;     // no need to continue;
                            break;

                        case EagleTunnelHandler.EagleTunnelRequestType.TCP:
                            done = TCPReqSender(tunnel, e);
                            break;
                        }
                    }
                    if (done)
                    {
                        result = tunnel;
                    }
                    else
                    {
                        tunnel.Close();
                    }
                }
            }
            return(result);
        }
        public static Tunnel Handle(string firstMsg, Socket socket2Client)
        {
            Tunnel result = null;

            if (!string.IsNullOrEmpty(firstMsg) &&
                socket2Client != null)
            {
                Tunnel tunnel = CheckVersion(firstMsg, socket2Client);
                if (tunnel != null)
                {
                    if (CheckAuthen(tunnel))
                    {
                        string req = tunnel.ReadStringL();
                        if (!string.IsNullOrEmpty(req))
                        {
                            EagleTunnelRequestType type = GetType(req);
                            bool done = false;
                            switch (type)
                            {
                            case EagleTunnelRequestType.DNS:
                                HandleDNSReq(req, tunnel);
                                // no need to continue;
                                break;

                            case EagleTunnelRequestType.TCP:
                                done = TCPReqHandle(req, tunnel);
                                break;
                            }
                            if (done)
                            {
                                result = tunnel;
                            }
                            else
                            {
                                tunnel.Close();
                            }
                        }
                    }
                }
            }
            return(result);
        }