Я давно написал для проксирования. У меня нет времени на его очистку, но если вы видите 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: