Подключение к собственному ПК с использованием публичного IP - PullRequest
0 голосов
/ 29 января 2012

У меня проблема с сокетами.Я написал себе два простых приложения, один сервер и один клиент.Сервер просто ожидает поступления UDP-пакета, распечатывая что-то в консоли, как только это произойдет.Клиент отправляет пакет UDP в конкретную конечную точку.

// server
Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
sock.Bind(new IPEndPoint(IPAddress.Any, 1337));
IPEndPoint remote = new IPEndPoint(IPAddress.Any, 0);
byte[] buf = new byte[1024];
sock.ReceiveFrom(buf, ref remote);
Console.WriteLine("Received packet.");

// client
Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
IPEndPoint remote = new IPEndPoint(IPAddress.Parse(Console.ReadLine()), UInt16.Parse(Console.ReadLine()));
byte[] buf = { 1, 2, 3, 4 }; // random data
sock.SendTo(buf, remote);

Теперь странная вещь заключается в том, что когда сокет клиента отправляет свой пакет на общедоступный IP-адрес моего маршрутизатора, сокет сервера получает его только в том случае,клиент не работает на том же компьютере, что и сервер.Поэтому, если я запустил сервер на своем ПК, а затем запустил клиент на своем ПК, ввел мой общедоступный IP-адрес и порт 1337, сервер ничего не получил.Однако, если я отправлю клиентское приложение своему другу и предоставлю ему мой IP-адрес и порт, оно будет работать отлично.Это также работает, если я позволю клиенту подключаться к моему локальному IP-адресу вместо моего публичного.

Я единственный, кто испытывает такое поведение?Порт 1337 перенаправляется на компьютер, на котором запущен сервер, кстати.

Ответы [ 2 ]

1 голос
/ 29 января 2012

Кажется, это проблема конфигурации NAT. Необходимо настроить nat на маршрутизаторе для пересылки пакетов, поступающих через открытый интерфейс с определенным портом (1337), для пересылки на сервер. Так что это работает, когда ваш друг отправляет вам пакет UDP.

Но вы не должны (даже не знаете, возможно ли это) настроить натинг наоборот, имея в виду тот же UDP-пакет, поступающий на внутренний интерфейс. Это тот случай, когда вы отправляете пакет с сервера на клиент с обоими на одном компьютере.

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

0 голосов
/ 29 января 2012

Большинство маршрутизаторов и модемов обычно не пересылают UDP-трафик - см. http://www.gotroot.com/blogpost4-Why-your-should-never-forward-UDP-out-of-your-firewall для объяснения. Также попробуйте подключить и клиент, и сервер к одной и той же физической сети (ну, подсети) и попытаться отправить дейтаграммы непосредственно на сервер вместо их пересылки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...