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(); } } }
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) { } } }