tvolodimir
9/14/2014 - 6:12 AM

tcp proxy

tcp proxy

using System;
using System.Net;
using System.Net.Sockets;
using System.Threading;

namespace Proxy
{
    class Program
    {
        static void Main(string[] args)
        {
            int localPort = int.Parse(args[0]);
            int openPort = int.Parse(args[1]);

            Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            listener.Bind(new IPEndPoint(IPAddress.Any, openPort));
            listener.Listen(10);

            while (true)
            {
                var c = listener.Accept();
                var s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                s.Connect(new IPEndPoint(IPAddress.Loopback, localPort));
                Thread serverThread = new Thread(o =>
                {
                    byte[] stuff = new byte[1024];
                    try
                    {
                        while (true)
                        {
                            int count = s.Receive(stuff);
                            if (count == 0)
                            {
                                s.Close();
                                return;
                            }
                            c.Send(stuff, count, SocketFlags.None);
                        }
                    }
                    catch (Exception)
                    {
                        s.Close();
                        c.Close();
                    }
                });
                Thread clientThread = new Thread(o =>
                {
                    try
                    {
                        byte[] stuff = new byte[1024];
                        try
                        {
                            while (true)
                            {
                                int count = c.Receive(stuff);
                                if (count == 0)
                                {
                                    c.Close();
                                    return;
                                }
                                s.Send(stuff, count, SocketFlags.None);
                            }
                        }
                        catch (Exception)
                        {
                            s.Close();
                            c.Close();
                        }
                    }
                    catch (Exception)
                    {
                    }
                });
                serverThread.Start();
                clientThread.Start();
            }
        }
    }
}