Автоматическая переадресация портов (UPnP) C++

отказ от ответственности: Я внимательно прочитал каждую подобную тему здесь и сделал поиск в 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 ? Может быть, есть lib (который я пропустил), чтобы использовать ? Посветите, пожалуйста. Заранее спасибо.

1 ответов


Run DeviceSpy С UPnP Developer Tools поиск сети InternetGatewayDevice. Если нет, ваш маршрутизатор не поддерживает UPnP или отключен. Если есть, проверьте WANIPConnection сервис. Имейте в виду, что с InternetGatewayDevice v2 (с 2010 года) вам не разрешено устанавливать статическое сопоставление портов (время аренды 0) через UPnP.

Как отметил @Rook, существуют и другие методы установления P2P-соединений, поэтому тот факт, что некоторые другие случайный программное обеспечение P2P работает, не обязательно означает, что программное обеспечение знает, как настроить отображение портов. Skype, в частности, на самом деле не P2P,это зависит от огромного количества выделенного суперузлы.