PortForwarding on C#
PortForwardingを実装してみた。といっても簡単なことしかできない。PortForward.exe lport:address:port として起動すると、ローカルのlportをaddressのportと結びつける。まだデータのやり取りをファイルとして保存する。(これが目的ww)
using System; using System.Collections.Generic; using System.Text; using System.Net.Sockets; using System.Threading; using System.IO; using System.Net; namespace PortForward { class PortForward { static int LPort; static string ForwardAddress; static int Port; static TcpListener server; static void Main(string[] _args) { { string[] args = _args[0].Split(':'); LPort = int.Parse(args[0]); ForwardAddress = args[1]; Port = int.Parse(args[2]); } server = new TcpListener(IPAddress.Loopback, LPort); server.Start(); Console.WriteLine("Forwarding Started {0}", _args[0]); Console.CancelKeyPress += new ConsoleCancelEventHandler(Console_CancelKeyPress); while (true) { Thread thread = new Thread(new ParameterizedThreadStart(CreateInstance)); thread.Start(server.AcceptTcpClient()); } } static void Console_CancelKeyPress(object sender, ConsoleCancelEventArgs e) { server.Stop(); } static void CreateInstance(object _TcpClient) { TcpClient tcpClient = _TcpClient as TcpClient; new PortForward(tcpClient); } TcpClient tcpClient; NetworkStream clientStream; TcpClient forwardClient; NetworkStream forwardStream; Thread readthread; Thread writethread; FileStream fileStream_read; FileStream fileStream_write; PortForward(TcpClient tcpClient) { Console.WriteLine("Connected {0}", this.GetHashCode()); this.tcpClient = tcpClient; this.clientStream = tcpClient.GetStream(); this.forwardClient = new TcpClient(ForwardAddress, Port); this.forwardStream = forwardClient.GetStream(); System.IO.Directory.CreateDirectory(this.GetHashCode().ToString()); this.readthread = new Thread(new ThreadStart(Read)); this.readthread.Start(); this.writethread = new Thread(new ThreadStart(Write)); this.writethread.Start(); } void Dispose() { clientStream.Dispose(); forwardStream.Dispose(); fileStream_write.Dispose(); fileStream_read.Dispose(); Console.WriteLine("Disconnected {0}",this.GetHashCode()); } void Read() { this. fileStream_read = new FileStream(this.GetHashCode().ToString() + "\\Read.txt", FileMode.Create); StreamReader forwardstreamReader = new StreamReader(forwardStream); while (true) { int read = forwardstreamReader.Read(); if (read == -1) break; this.clientStream.WriteByte((byte)read); this.fileStream_read.WriteByte((byte)read); } writethread.Abort(); Dispose(); } void Write() { this.fileStream_write = new FileStream(this.GetHashCode().ToString() + "\\Write.txt", FileMode.Create); StreamReader streamReader = new StreamReader(clientStream); while (true) { int read = streamReader.Read(); if (read == -1) break; forwardStream.WriteByte((byte)read); this.fileStream_write.WriteByte((byte)read); } readthread.Abort(); Dispose(); } } }