Пробивание отверстий NAT с помощью ENet

Я долго искал простую библиотеку UDP C ++, которая обеспечивает надежность. Я только что натолкнулся на ENet, который выглядит отлично, за исключением того, что я не могу найти никакой поддержки для пробивки NAT в документации. В Интернете, кажется, есть несколько человек, обсуждающих это, но мне еще предстоит найти определенный ответ на вопрос, возможно ли это.

У меня уже есть сторонний сервер, настроенный на раздачу внешних ips & порты для клиентов.

Если это возможно, может кто-нибудь дать псевдокод / ​​шаги, описывающие процесс?

1

Решение

Я понял это. Вот что я сделал:

  1. Создать хост для текущего клиента
  2. Подключиться к стороннему серверу
  3. Когда другой клиент подключается к стороннему серверу, он отправляет информацию о других клиентах каждому клиенту
  4. Получив адрес однорангового узла, каждый одноранговый узел пытается установить соединение с другим одноранговым узлом в том же сокете, который использовался для подключения к серверу, и начинает отправку пакетов по этому адресу. Это было изначально моей проблемой. Я отправлял только пару пакетов, и они могли быть легко потеряны. Соединение будет работать только половину времени. Я закончил тем, что порождал поток, который отправлял пакеты, пока соединение не установилось или не прервалось.
  5. Соединение должно быть установлено после отправки нескольких пакетов
2

Другие решения

использование STUN для перфорации, а затем использовать ENet.
Связь с STUN-сервером и получение публичная конечная точка а также Тип NAT. Убедитесь, что тип NAT открыт, а затем продолжайте => использовать getsockname на сокет, который используется для связи с STUN-сервером, чтобы получить локальная конечная точка а затем закройте эту розетку.
Теперь создайте сервер ENet и инициализируйте его локальная конечная точка. Теперь ваши клиенты ENet с других компьютеров могут подключаться к серверу, используя публичная конечная точка.

1

UDP может отбрасывать пакеты и отправлять пакеты не по порядку.
Заказывать пакеты тривиально.
Но если пакет был отброшен, восстановить его невозможно. Однако многие системы, использующие UDP, предоставляют вам другой поток с дублирующимися данными. В этом случае вы можете просто создать резервную копию со вторичным потоком и затем обновить проверку, если пакет, отброшенный в первом потоке, доступен во втором.

-1
По вопросам рекламы [email protected]