Автоматическая переадресация портов (UPnP?) С++
Отказ:
Я внимательно прочитал все похожие темы здесь и сделал поиск в Google. Никто из них не ответил на мои вопросы, поэтому я хотел бы накопить информацию в этой теме.
Постскриптум Я, возможно, не так хорош на английском, сожалею об этом.
Я хочу создать приложение p2p (игра). Очевидно, что многие люди будут запускать эту программу на машине, которая является частью локальной сети с одной точкой доступа в Интернет (маршрутизатор) и приложение просто не будет работать без переадресации портов. Итак, я сделал исследование и выяснил, что могу выполнять автоматическую переадресацию портов с помощью UPnP. Микропрограммный код был написан для доступа к переадресации портов:
bool CPortController::Init() {
HRESULT result = CoInitialize(NULL); // Must be NULL
if (FAILED(result)) return false;
result = CoCreateInstance(__uuidof(UPnPNAT), NULL, CLSCTX_ALL, __uuidof(IUPnPNAT), (void **)&Nat);
if (FAILED(result) || !Nat) return false;
result = Nat->get_StaticPortMappingCollection(&Collection);
if (FAILED(result) || !Collection) return false; // Here I'm getting S_OK as result, but Collection is always == 0
return true;
}
Искал причину этого (см. комментарий в коде). Я нашел:
1. Старая система (нет, у меня есть Win7 с обновлениями)
2. Маршрутизатор может не иметь возможности UPnP или может быть не включен
3. Брандмауэр может блокировать TCP-порт 2869 или UDP-порт 1900, которые необходимы для UPnP
К сожалению, у меня нет доступа к маршрутизатору, чтобы проверить последние 2, но это не так важно, поскольку Skype и uTorrent (оба p2p) работают отлично. Мне нужно найти способ сделать тот же трюк и переадресовать порт автоматически с моим приложением, не попросив пользователя ничего сделать.
О библиотеках UPnP:
Я нашел несколько библиотек UPnP (PlatinumUPnP, miniUPnP), но у них, похоже, столько кодов, ориентированных на поиск смарт-устройств и объединение их... uhm... Я не уверен, что мне нужно это, чтобы выполнить свою задачу и Я не могу найти фрагмент кода (который не использует эти WinUPnPAPI, перечисленные выше) для автоматической пересылки портов.
Теперь я немного потерялся. Может ли кто-нибудь показать мне направление продолжения исследований? Может быть, для этого есть что-то еще, чем UPnP? Может быть, есть lib (который я пропустил), чтобы использовать? Распространите немного света, пожалуйста. Заранее благодарю вас.
Ответы
Ответ 1
Запустите DeviceSpy из UPnP Developer Tools и найдите свою сеть для InternetGatewayDevice
. Если их нет, ваш маршрутизатор не поддерживает UPnP или отключен. Если есть, проверьте WANIPConnection
службу. Имейте в виду, что с InternetGatewayDevice v2 (с 2010 года) вам не разрешено устанавливать сопоставление статического порта (время аренды 0) поверх UPnP.
Как отметил @Rook, существуют другие способы установления соединений P2P, поэтому тот факт, что работает какое-то другое случайное программное обеспечение P2P, не обязательно означает, что программное обеспечение знает, как настроить сопоставление портов. Skype, в частности, не является P2P, он зависит от огромного количества выделенных супернов.