0

它少于<130行。没有什么是复杂的。为什么这段代码这么慢以至于我的代理无法使用?访问网页需要几秒钟的时间,并且在访问 2/3 个域后会变得更糟。

CPU也穿过屋顶,这让我感到困惑。我也不能超过 350kb 秒下载一个大文件(我通过下载 linux iso 进行测试,我得到 >350 w/o 代理)

using System;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net.Sockets;
using System.IO;
using System.Net;
using System.Threading;

namespace ProxyBox
{
    class Program
    {
        static ManualResetEvent tcpClientConnected =new ManualResetEvent(false);
        static void Main(string[] args)
        {
            var s2 = new TcpListener(9998);
            s2.Start();
            Task.Run(() =>
            {
                while (true)
                {
                    tcpClientConnected.Reset();
                    s2.BeginAcceptTcpClient(Blah, s2);
                    tcpClientConnected.WaitOne();
                }
            });
            while (true)
                System.Threading.Thread.Sleep(10000000);
        }

        static void Blah(IAsyncResult ar)
        {
            Console.WriteLine("Connection");
            TcpListener listener = (TcpListener)ar.AsyncState;
            using (var socketin = listener.EndAcceptTcpClient(ar))
            {
                tcpClientConnected.Set();
                var ns1 = socketin.GetStream();
                var r1 = new BinaryReader(ns1);
                var w1 = new BinaryWriter(ns1);

                {
                    if (!(r1.ReadByte() == 5 && r1.ReadByte() == 1))
                        return;
                    var c = r1.ReadByte();
                    for (int i = 0; i < c; ++i)
                        r1.ReadByte();
                    w1.Write((byte)5);
                    w1.Write((byte)0);
                }
                {
                    if (!(r1.ReadByte() == 5 && r1.ReadByte() == 1))
                        return;
                    if (r1.ReadByte() != 0)
                        return;
                }
                byte[] ipAddr = null;
                string hostname = null;
                var type=r1.ReadByte();
                switch (type)
                {
                    case 1:
                        ipAddr = r1.ReadBytes(4);
                        break;
                    case 3:
                        hostname = Encoding.ASCII.GetString(r1.ReadBytes(r1.ReadByte()));
                        break;
                    case 4:
                        throw new Exception();
                }
                var nhport=r1.ReadInt16();
                var port = IPAddress.NetworkToHostOrder(nhport);

                var socketout = new TcpClient();
                if (hostname != null)
                    socketout.Connect(hostname, port);
                else
                    socketout.Connect(new IPAddress(ipAddr), port);

                w1.Write((byte)5);
                w1.Write((byte)0);
                w1.Write((byte)0);
                w1.Write(type);
                switch (type)
                {
                    case 1:
                        w1.Write(ipAddr);
                        break;
                    case 2:
                        w1.Write((byte)hostname.Length);
                        w1.Write(Encoding.ASCII.GetBytes(hostname), 0, hostname.Length);
                        break;
                }
                w1.Write(nhport);

                var buf = new byte[4096];
                var ns2 = socketout.GetStream();
                var r2 = new BinaryReader(ns2);
                var w2 = new BinaryWriter(ns2);
                while (true)
                {
                    var a = true;
                    while (ns1.DataAvailable)
                    {
                        var len = r1.Read(buf, 0, buf.Length);
                        w2.Write(buf, 0, len);
                        a = false;
                    }
                    while (ns2.DataAvailable)
                    {
                        var len = r2.Read(buf, 0, buf.Length);
                        w1.Write(buf, 0, len);
                        a = false;
                    }
                    if (a)
                    {
                        if (socketout.Connected == false || socketin.Connected == false)
                            return;                        
                        System.Threading.Thread.Sleep(0);
                    }
                }
            }
        }
    }
}
4

0 回答 0