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


    }

}