Beispiel #1
0
        static void Worker()
        {
            while (true)
            {
                var tunnel_listener = new TcpListener(IPAddress.Any, 41111);
                Console.WriteLine("Tunnel listening");
                tunnel_listener.Start();
                var tunnel = tunnel_listener.AcceptTcpClient();
                tunnel.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, true);
                Console.WriteLine("Tunnel connected");

                var rdp_listener = new TcpListener(IPAddress.Any, 3389);
                Console.WriteLine("Ready for RDP connection");
                rdp_listener.Start();
                try
                {
                    using (var rdp = rdp_listener.AcceptTcpClient())
                    {
                        Console.WriteLine("RDP Connected");
                        rdp.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, true);
                        tunnel.GetStream().Write(new byte[1] {
                            0x77
                        }, 0, 1);

                        Console.WriteLine("Starting data forwarding");
                        var f1 = new Common.Forwarder(tunnel, rdp);
                        var f2 = new Common.Forwarder(rdp, tunnel);
                        ManualResetEvent connection_lost = new ManualResetEvent(false);
                        f1.connection_lost += () => { connection_lost.Set(); };
                        f2.connection_lost += () => { connection_lost.Set(); };
                        connection_lost.WaitOne();
                    }
                }
                catch (System.IO.IOException)
                {
                }
                finally
                {
                    tunnel_listener.Stop();
                    rdp_listener.Stop();
                    tunnel.Close();
                }
            }
        }
Beispiel #2
0
        static void Worker(string tunnel_host, string rdp_server)
        {
            while (true)
            {
                try {
                    using (var tunnel = new TcpClient())
                    {
                        tunnel.Connect(tunnel_host, 44444);
                        tunnel.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, true);
                        Console.WriteLine("Tunnel Connected, waiting for start signal");
                        byte[] start_buffer = new byte[1];
                        tunnel.GetStream().Read(start_buffer, 0, 1);
                        if (start_buffer[0] != 0x77)
                        {
                            Console.WriteLine(string.Format("Got invalid start character {0} :( !!!", start_buffer[0]));
                            break;
                        }

                        using (var localrdp = new TcpClient())
                        {
                            localrdp.Connect(rdp_server, 3389);
                            Console.WriteLine("Rdp connected");
                            var f1 = new Common.Forwarder(tunnel, localrdp);
                            var f2 = new Common.Forwarder(localrdp, tunnel);

                            ManualResetEvent connection_lost = new ManualResetEvent(false);
                            f1.connection_lost += () => { connection_lost.Set(); };
                            f2.connection_lost += () => { connection_lost.Set(); };
                            connection_lost.WaitOne();
                        }
                    }
                }
                catch (System.IO.IOException)
                {
                }
            }
        }