UDP Hole Punching (c ++ / winsock)

пользователи stackoverflow!

У меня есть приложение, которое имеет дело с p2p, и именно так я добираюсь до перфорации UDP Hole. Но я столкнулся с проблемами с реализацией. Надеюсь, вы можете дать мне несколько советов.

У меня есть сервер, который отлично работает и знакомит клиентов друг с другом, но клиенты не могут подключиться, вероятно, из-за моего небольшого опыта работы с сокетами. Итак, клиентский алгоритм это:

  1. Создать сокет udp (сокет (AF_INET, SOCK_DGRAM, IPPROTO_UDP);)
  2. Отправить сообщение на сервер через Отправить функция
  3. использование recvfrom функция шкафчика для получения ответа от сервера

После этих 3 шагов я получаю конечную точку. Далее я пытался подключить клиентов двумя способами:

Way1:

  1. Используйте тот же сокет для отправки данных через Отправить функция, но передавая другой SOCKADDR
  2. Слушай с recvfrom функция шкафчика (и в этот момент я получаю WSAECONNRESET ошибка)

Way2:

  1. Создать новый сокет
  2. Свяжите это
  3. Используйте это, чтобы отправить данные пиру
  4. Слушать

Таким образом, один клиент терпит неудачу при привязке, а другой — при прослушивании с ошибками. WSAEADDRINUSE а также WSAECONNRESET. Я явно делаю что-то не так, и ваша помощь будет высоко оценена. Заранее спасибо.

Постскриптум Хочу поделиться хорошей статьей об UDP Hole Punching, чтобы помочь новичкам в этой технике: http://www.brynosaurus.com/pub/net/p2pnat/

1

Решение

если ты читать документацию за recvfrom(), это говорит:

WSAECONNRESET

Виртуальный канал был сброшен удаленной стороной, которая выполняла жесткое или аварийное закрытие. Приложение должно закрыть сокет; это больше не годится для использования. В сокете UDP-дейтаграммы эта ошибка указывает на то, что предыдущая операция отправки привела к сообщению ICMP Port Unreachable.

Что означает ваш призыв к sendto() терпит неудачу. Это имеет смысл, если один или оба клиента находятся за маршрутизатором. Исходя из вашего описания (и отсутствия кода), вы на самом деле не выполняете пробивки дырок, чтобы открыть маршрутизатор (-ы) для пропуска пакетов от клиента к клиенту. Вы только отправили сообщение на свой сервер, что позволяет передавать пакеты клиент-сервер и сервер-клиент. Для выполнения пробивки отверстий на каждом конце требуется еще несколько обменов пакетами между каждым клиентом и сервером, как подробно описано в статья, на которую вы ссылаетесь. Вы действительно делаете то, что говорится в статье?

2

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

Других решений пока нет …

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