Нет причин, по которым это должно вызывать какие-либо проблемы, при условии, что одна сторона не находится за NAT, а сторона, которая за NAT, отправляет первый пакет.Просто следуйте этим правилам:
1) На сервере проверьте список всех IP-адресов хоста.Свяжите сокет UDP с каждым IP-адресом.Вы можете пропустить это, если у сервера есть только один публичный IP-адрес, и это единственный адрес, по которому он будет достигнут.
2) Отправьте ответ UDP точно на тот же сокет, на который вы получили запрос.Это очень важно для обеспечения того, чтобы адрес источника ответа соответствовал адресу назначения.
3) Отправьте ответ UDP точно на тот же IP-адрес и порт, на который вы получили запрос.Не обращайте внимания на то, что другой конец говорит о том, что он считает своим IP-адресом или с какого порта он отправляет.
И несколько замечаний:
Под "сервером" я имею в виду сторонуэто не за NAT.Если у вас нет различий между клиентом и сервером, следуйте правилам сервера для обеих сторон, и с вами все будет в порядке.
Эти правила применяются независимо от того, является ли пакет, строго говоря, ответом.Они применимы к любому пакету, который вы ожидаете получить на другую сторону.
Помните, что вы не можете полагаться на информацию IP / порта в пакете, чтобы сказать вам, откуда пришел пакет, потому что NAT может изменить его,Таким образом, вам нужно будет поместить достаточно информации в полезную нагрузку дейтаграммы, чтобы сделать это.В идеале следует ожидать, что IP / порт конечной точки может измениться в любое время, и отправлять все пакеты на IP / порт, с которого вы последний раз получали пакет от этого конкретного клиента.