C# прокси сервер, нужна помощь

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by hepper, 7 Aug 2012.

  1. hepper

    hepper New Member

    Joined:
    2 Sep 2011
    Messages:
    1
    Likes Received:
    0
    Reputations:
    0
    привет всем. помогите с прокси, наваял простой прокси сервер для переправки двоичных данных по http протоколу, но проксик отказывается работать, точнее он то работает нормально, то не работает вообще, то теряет пакеты то конект рвет.
    не могу понять в чем дело. может кто помочь с оптимизацитей или правкой

    Code:
    namespace ConsoleApplication13_aproxy
    {
        using System;
        using System.IO;
        using System.Net;
        using System.Net.Sockets;
        using System.Text.RegularExpressions;
        using System.Threading;
    
        class Program
        {
            static void Main(string[] args)
            {
                TcpListener myTCP = new TcpListener(IPAddress.Parse("127.0.0.1"), 8888);
    
                myTCP.Start(50);
    
                while (true)
                {
                    // смотрим, есть запрос или нет
                    if (myTCP.Pending())
                    {
                        // запрос есть
                        // передаем его в отдельный поток
                        Thread t = new Thread(ExecuteRequest);
                        t.IsBackground = true;
                        t.Start(myTCP.AcceptSocket());
                    }
                }
                myTCP.Stop();
            }
    
            private static void ExecuteRequest(object arg)
            {
                //Stopwatch stopWatch = new Stopwatch();
                var tcpclientBP = new TcpClient(); //сокет локальный клиент-прокси
                tcpclientBP.Client = (Socket)arg;
                tcpclientBP.ReceiveBufferSize = 50000;
                tcpclientBP.SendBufferSize = 50000;
    
    
                var tcpclientPS = new TcpClient();//сокет прокси-удаленный сервер
                tcpclientPS.Client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                tcpclientPS.ReceiveBufferSize = 50000;
                tcpclientPS.SendBufferSize = 50000;
    
                // соединяемся
                try
                {
                    if (tcpclientBP.Connected)
                    {
                        var bpr = new BinaryReader(tcpclientBP.GetStream());
                        var bpw = new BinaryWriter(tcpclientBP.GetStream());
    
                        if (tcpclientBP.Available > 0)
                        {
                            byte[] httpRequest = new byte[50000];
                            int readbytes = 0;
                            do
                            {
                                readbytes = bpr.Read(httpRequest, 0, httpRequest.Length);
    
                            } while ((tcpclientBP.GetStream()).DataAvailable);
    
                            var tmp1 = new byte[readbytes];
                            Array.Copy(httpRequest, tmp1, tmp1.Length);
    
                            var myIPEndPoint = GetEIPhost(tmp1);
    
                            tcpclientPS.Connect(myIPEndPoint);
                            var psr = new BinaryReader(tcpclientPS.GetStream());
                            var psw = new BinaryWriter(tcpclientPS.GetStream());
    
                            psw.Write(tmp1, 0, tmp1.Length);
    
                            byte[] httpResponse = new byte[50000];
                            int readbytes1 = 0;
                            do
                            {
                                readbytes1 = psr.Read(httpResponse, 0, httpResponse.Length);
    
                            } while ((tcpclientPS.GetStream()).DataAvailable);
    
                            var tmp2 = new byte[readbytes1];
                            Array.Copy(httpResponse, tmp2, tmp2.Length);
    
                            bpw.Write(tmp2, 0, tmp2.Length);
    
                        }
    
                    }
                }
                catch (Exception e)
                {
                    Console.WriteLine(e);
                }
    
                tcpclientPS.Close();
    
                tcpclientBP.Close();
    
            }
    
            private static IPEndPoint GetEIPhost(byte[] httpRequest)
            {
                Regex myReg = new Regex(@"Host: (((?<host>.+?):(?<port>\d+?))|(?<host>.+?))\s+",
                                        RegexOptions.Multiline | RegexOptions.IgnoreCase);
                Match m = myReg.Match(System.Text.Encoding.ASCII.GetString(httpRequest));
                string host = m.Groups["host"].Value;
                int port = 0;
    
                // если порта нет, то используем 80 по умолчанию
                if (!int.TryParse(m.Groups["port"].Value, out port))
                {
                    port = 80;
                }
    
                // получаем апишник по хосту
                IPHostEntry myIPHostEntry = Dns.GetHostEntry(host);
    
                // создаем точку доступа
                IPEndPoint myIPEndPoint = new IPEndPoint(myIPHostEntry.AddressList[0], port);
                return myIPEndPoint;
            }
    
        }
    }