Могу ли я использовать разные порты приема / отправки на UDP-сервере для клиента, находящегося за NAT? - PullRequest
0 голосов
/ 09 марта 2020

Я пишу UDP-сервер, который обслуживает клиентов, которые находятся за NAT. Клиенты отправляют запрос на publi c IP и какой-то предопределенный порт. Сервер получает сообщение, создает (получает из пула) поток и передает сообщение потоку (обработчику).

Вопрос: могу ли я использовать новый сокет (другой порт) для отправки ответа или мне следует использовать тот же порт (сокет), который получил запрос?

1 Ответ

1 голос
/ 09 марта 2020

Вам необходимо отправить запрос с того же IP-адреса, порта на сервере, на котором он был получен, и на тот же общедоступный c видимый IP-адрес, порт на клиенте, с которого вы получили данные. В противном случае NAT не сможет преобразовать IP-адрес и порт в пакете обратно исходному клиенту за NAT.

Вы можете выполнить это требование, используя один сокет сервера, который связан с IP-адресами серверов и порт и не подключен к указанному c клиенту. Затем используйте recvfrom для получения данных и sendto для отправки, используя адрес, возвращенный recvfrom в качестве цели в sendto.

...