Автоматическая переадресация портов (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, он зависит от огромного количества выделенных супернов.