Я давно написал для проксирования. У меня нет времени на его очистку, но если вы видите TcpProxy, который является родительским классом, который принимает соединение, Client является принятым соединением, а RemoteEndPoint является конечной точкой для соединения. Он также записывает данные в файл и выполняет другие действия, которые вы можете игнорировать.

ужно установить TCP-соединение с моего домашнего компьютера на мой офисный компьютер.

в офисе есть маршрутизатор, к которому подключено несколько компьютеров. у этого роутера есть интернет, поэтому у всех компьютеров, подключенных к этому роутеру, тоже есть интернет. у меня дома есть компьютер с доступом в интернет. Мне нужно, чтобы мой офисный компьютер выполнял роль сервера, а домашний компьютер подключался к нему. Раньше я имел возможность подключаться с помощью переадресации трафика на порт как:

    NATUPNPLib.UPnPNATClass upnpnat;
    NATUPNPLib.IStaticPortMappingCollection mappings;

    public ServerExample()
    {
        InitializeComponent();

        upnpnat = new NATUPNPLib.UPnPNATClass();
        mappings = upnpnat.StaticPortMappingCollection;

        //                           server local IP address
        mappings.Add(1300, "TCP", 1300, "192.168.150.146", true, "plsease work");
        // this code tels the router to forward all tcp traffic comming from port
        // 1300 to the server computer (it's lan ip address happens to be 192.168.150.146)
        //...

и я смог подключиться из моего дома. (Я знаю, что простым способом будет открыть порты на офисном маршрутизаторе и перенаправить их на мой компьютер, проблема в том, что у меня нет доступа к офисному маршрутизатору)

теперь они заменили маршрутизатор в моем офисе на новый, и я не могу использовать свой код. Теперь, с новым маршрутизатором, когда я выполняю простой код, который я получаю:

обратите внимание, что сопоставления возвращают ноль; поэтому я не могу добавить отображение.

Я уверен, что должен быть способ установить соединение, потому что некоторые люди в офисе, например, используют limewire или немного торрент. Я думаю, что моя проблема связана с разрешениями, может быть? Как я могу решить это?

редактироватьТаким образом, из исследования я обнаружил, что я пытаюсь сделать «дыру в брандмауэре по протоколу UDP». Я на самом деле хочу сделать это через TCP-соединение. Я не знаю, в чем будет разница между tcp и upd puch holing .... Я имею в виду, что цель в том, чтобы клиент мог найти грушу без необходимости конфигурировать маршрутизатор.

.

.

.

.

.

.

ОБНОВИТЬ

Хорошо, так что я думаю, что я пытался сделать то, что вы, ребята, разместили по этому вопросу с помощью c #: хорошо, позвольте мне показать вам, что я сделал:

обратите внимание, что вам может понадобиться обратиться к этой диаграмме, чтобы понять, что я буду объяснять:

Как вы знаете, я хочу установить tcp-соединение между компьютером A и компьютером B. Мне удается это сделать, выполнив то, что называется tcp punch holing.

Шаг 1: Первое, что я делаю, это начинаю прослушивать новые соединения на сервере S.

                   TcpListener server = new TcpListener(System.Net.IPAddress.Parse(“192.168.11.109”), 55550);
                   Server.Start();

                   var client = server.AcceptSocket();  \\ wait here until someone connects

Шаг 2: Теперь подключитесь к серверу с компьютером A как:

          TcpClient tcpClient = new TcpClient("192.168.11.109", 55550);

Шаг 3: После выполнения кода шага 2 на компьютере A отладка сервера S должна выглядеть следующим образом:

Шаг 4: Теперь наша цель - подключиться с компьютера B к компьютеру A. Сервер S имеет информацию, необходимую B для установления соединения. На самом деле мне нужно будет установить соединение между компьютером B и сервером S, чтобы сервер S мог дать B соответствующие параметры, чтобы B мог подключиться к A.

Шаг 5: так как я отлаживаю, я могу видеть параметры, поэтому теперь я сделаю компьютер A сервером, прослушивая порт 3313. Я хочу, чтобы компьютер A теперь прослушивал этот порт (3313), поскольку все пакеты отправлены маршрутизатору. X с портом 3313 следует отправить на компьютер A.

       \\ COMPUTER A 
       TcpListener server = new TcpListener(System.Net.IPAddress.Parse("192.168.0.120"), 3313);
        server.Start();

        var newClient = server.AcceptSocket();  \\ wait here until a client gets connected

Шаг 6: Таким образом, компьютер A теперь должен ожидать новых подключений через порт 3313. Опять же, порт 3313 важен, поскольку маршрутизатор x должен пересылать все пакеты, полученные с этого порта, на компьютер A.

Компьютер А ждет новых подключений.

Шаг 7: Так что теперь быстро! Мы хотим установить это соединение с компьютера B. В действительности сервер S будет передавать параметры, но, поскольку я просто пытаюсь выполнить эту работу, я очень быстро напишу программу на компьютере B.

          TcpClient tcpClient = new TcpClient(“192.168.11.108”, 3313);
           \\192.168.11.108  is the address of router X

В заключение:

По какой-то причине компьютер B не может подключиться к компьютеру A.

Причина, по которой он не может подключиться, состоит в том, что маршрутизатор X не переадресовал пакеты на компьютер A. (Я знаю это, потому что я включил переадресацию портов на порт 54540 на маршрутизаторе X, и когда я использую этот порт, он работает) не понимаю, почему маршрутизатор X не перенаправил трафик, поступающий из порта 3313, на компьютер A. Компьютер A уже установил соединение с сервером S, и все вещи, которые сервер S отправил маршрутизатору X через порт 3313, были отправлены на компьютер A. Почему если я отправлю пакеты на маршрутизатор X через порт 3313, они не будут получены компьютером A !?

PS:

Обратите внимание, что все, что я здесь показал, у меня фактически есть три маршрутизатора X, Y и Z, а также у меня есть сервер S, компьютер A и компьютер B:

Ответы на вопрос(4)

Ваш ответ на вопрос