C # TCP PortForwarder останавливает прослушивание / отклоняет новые подключения - PullRequest
0 голосов
/ 28 января 2019

Я пытаюсь создать TCP "Proxy" или "PortForwarder", используя TcpClient и TcpListener в C #.Из примеров MSDN и примера «Простой TCP Forwarder в C #» (хотя я хочу использовать вместо него TcpClient / Listener!) Я смог получить базовый Listener + Client + Forwarder.Я планирую сделать это асинхронным в будущем.Проблема, с которой я сталкиваюсь, заключается в том, что любое новое соединение через прослушиватель не «подключается» или получает отказ.

Я уже пытался сделать его асинхронным, чтобы избежать «блокировки» сокета.Кажется, это не имеет никакого значения.Я убедился, что порт открыт, и есть приемный сокет, к которому я звоню «Подключиться».

    public void StartProxy()
    {
        TcpListener listener = new TcpListener(IPAddress.Parse("127.0.0.1"), 1709);

        listener.Start();

        TcpClient client = listener.AcceptTcpClient();
        TcpClient forwarder = new TcpClient();

        client.NoDelay = true;
        forwarder.NoDelay = true;

        forwarder.Connect(IPAddress.Parse("*Server IP*"), 1992);

        while (true)
        {
            DataExchange(client, forwarder);
            DataExchange(forwarder, client);
        }
    }

    public void DataExchange(TcpClient client, TcpClient forwarder)
    {
        int bytesRead = 0;
        byte[] buffer = new byte[8192];

        bytesRead = client.GetStream().Read(buffer, 0, buffer.Length);

        if (bytesRead > 0)
        {
            forwarder.GetStream().Write(buffer, 0, bytesRead);
        }
    }

Первым тестом, который я использовал, было использование PSTools и ping "127.0.0.1:1709".Он пингует и получает результат штраф за первые 32 пинга - затем он закрывается / отказывается больше.РЕДАКТИРОВАТЬ: Когда он закрывает / прекращает принимать больше пингов, загрузка ЦП приложения резко возрастает с 0% до 12% и остается там.

Второй тест на самом деле был направить мой трафик World of Warcraft через него,Когда открывается первый сокет / соединение, оно пересылается и получает результат в порядке.Как только открывается второе соединение, оно никогда не достигает своего места назначения.Например, первое соединение - это вход в игру, а второе - выбор сервера.Я получу «Успех» при входе в игру, но это не пойдет дальше.

Я новичок в этом, и я ценю любую помощь, которая поможет мне преодолеть это препятствие!

...