Как я могу открыть порт TCP / UDP на моем NAT для настройки приложения P2P?

Я разрабатываю приложение P2P в Delphi XE5 с удаленным сервером PHP в качестве трекера для составления списка клиентских сокетов. Я боюсь, что использование UDP Hole Punching в какой-то момент не сработает, если клиентский NAT решит закрыть / заблокировать тот случайный порт, который он создал в первом сообщении, отправленном на удаленный сервер PHP.

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

Могу ли я сделать это и использовать сервер только для хранения сокета без PHP-P-H и быть уверенным, что, по крайней мере, пока приложение Delphi работает, порт останется открытым?

Если я решу использовать пробивку отверстий UDP с удаленного сервера, будет ли NAT поддерживать порт, открытый для локального ПК пользователя, если другие пользователи не подключатся к нему напрямую (P2P) достаточно скоро?

Если я открою этот порт с помощью UDP, могу ли я использовать TCP после этого?

Замечания: Delphi XE5 для компиляции в Windows 32 и Android, поэтому мне нужно решение, отличное от Windows.


person Please_Dont_Bully_Me_SO_Lords    schedule 13.05.2014    source источник
comment
Я только что обнаружил, что это называется UPNP. Следовательно, компонент для работы с ним уже должен существовать.   -  person Please_Dont_Bully_Me_SO_Lords    schedule 13.05.2014


Ответы (1)


У Microsoft есть API для работы с NAT через uPNP, особенно для назначения сопоставлений портов. Посмотрите на интерфейс IUPnPNAT и его свойство StaticPortMappingCollection. Используйте IStaticPortMappingCollection.Add для назначения портов в NAT.

Конечно, это работает только с маршрутизаторами, на которых включен uPNP. Не все маршрутизаторы вообще поддерживают uPNP или имеют включенный uPNP.

person Remy Lebeau    schedule 13.05.2014
comment
Спасибо, но есть ли решение, которое не привязано к Windows? Я хочу использовать его также в Windows, а также в Android (XE5) - person Please_Dont_Bully_Me_SO_Lords; 13.05.2014
comment
Итак, эта проблема доступности uPNP говорит мне, что я действительно должен использовать пробивку отверстий UDP, верно? - person Please_Dont_Bully_Me_SO_Lords; 13.05.2014
comment
Android не имеет собственного API uPNP, поэтому вам нужно будет найти стороннюю реализацию (обратите внимание, что она будет работать только при подключении к Wi-Fi, не при беспроводном подключении). Но это не поможет вам, если вы изначально не используете маршрутизатор с поддержкой uPNP. Если вы действительно хотите быть надежным, вам придется использовать несколько методов обхода NAT в своем приложении (пробивка отверстий - одна из многих), как это делают большие приложения. - person Remy Lebeau; 13.05.2014