Итак, мне нужно мое приложение на C ++, чтобы установить одноранговое UDP-соединение. Я рассмотрел дырокол и UPNP (используя сопоставление портов). Пробивание отверстий кажется немного грязным: вам нужен сервер, тонны мусорных пакетов UDP. я действительно не хочу связываться с сервером, поэтому я выбрал UPNP. Я построил miniupnpc http://miniupnp.free.fr/ библиотека, и с радостью использовал его дома. Но когда я попробовал свое приложение в других сетях, я получил очень разочаровывающие результаты:
Итак, у меня есть 2 вопроса:
Спасибо!
- UPNP не очень распространен, или мне просто не повезло, или я неправильно использую miniupnpc?
Вы не можете доверять случайному маршрутизатору для поддержки сопоставления портов UPnP IGD, и вы определенно не можете доверять включенной функции.
Существуют ли другие способы сделать одноранговое соединение UDP, которое
не требует внешнего сервера? (так что не дырокол)
Сторонний сервер, строго говоря, не требуется для пробивки дырок в типичных домашних сетях, но вам нужен способ, чтобы конечные точки знали о внешнем IP-адресе и порте друг друга: в этот момент обе машины могут просто начать отправлять сообщения друг другу: первые сообщения действительно будут отброшены, но когда маршрутизатор увидит, что внутренний IP-адрес уже отправил пакеты на внешний IP-адрес, он также разрешит входящий трафик (поскольку маршрутизатор воспринимает их как ответы на пакеты от внутреннего IP-адреса, даже если они не ‘ т действительно).
Увидеть ICE за то, что напоминает стандарт в этой области.