отказ:
Я внимательно прочитал все подобные темы здесь и сделал поиск в 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), но, похоже, в них так много кода, ориентированного на поиск интеллектуальных устройств и их объединение … хм … я не уверен, что мне нужно это для выполнения моей задачи и Я не могу найти кусок кода (который не использует те WinUPnPAPI, которые я перечислил выше) для автоматической переадресации портов.
Я немного растерялся сейчас. Может ли кто-нибудь показать мне направление для продолжения исследований? Может быть, есть что-то еще, кроме UPnP для этого? Может быть, есть библиотека (которую я пропустил) для использования? Распространите немного света, пожалуйста. Заранее спасибо.
Бежать DeviceSpy от Инструменты разработчика UPnP и искать в вашей сети InternetGatewayDevice
, Если его нет, ваш маршрутизатор не поддерживает UPnP или отключен. Если есть, проверьте WANIPConnection
оказание услуг. Имейте в виду, что начиная с InternetGatewayDevice v2 (с 2010 года) вам не разрешено устанавливать статическое сопоставление портов (время аренды 0) через UPnP.
Как отметил @Rook, существуют и другие способы установления P2P-соединений, поэтому тот факт, что некоторое другое случайное программное обеспечение P2P работает, не обязательно означает, что программное обеспечение знает, как настроить сопоставление портов. Скайп в частности не очень P2P, это зависит от огромного количества выделенных суперузлов.
Других решений пока нет …