пользователи stackoverflow!
У меня есть приложение, которое имеет дело с p2p, и именно так я добираюсь до перфорации UDP Hole. Но я столкнулся с проблемами с реализацией. Надеюсь, вы можете дать мне несколько советов.
У меня есть сервер, который отлично работает и знакомит клиентов друг с другом, но клиенты не могут подключиться, вероятно, из-за моего небольшого опыта работы с сокетами. Итак, клиентский алгоритм это:
После этих 3 шагов я получаю конечную точку. Далее я пытался подключить клиентов двумя способами:
Way1:
Way2:
Таким образом, один клиент терпит неудачу при привязке, а другой — при прослушивании с ошибками. WSAEADDRINUSE а также WSAECONNRESET. Я явно делаю что-то не так, и ваша помощь будет высоко оценена. Заранее спасибо.
Постскриптум Хочу поделиться хорошей статьей об UDP Hole Punching, чтобы помочь новичкам в этой технике: http://www.brynosaurus.com/pub/net/p2pnat/
если ты читать документацию за recvfrom()
, это говорит:
WSAECONNRESET
Виртуальный канал был сброшен удаленной стороной, которая выполняла жесткое или аварийное закрытие. Приложение должно закрыть сокет; это больше не годится для использования. В сокете UDP-дейтаграммы эта ошибка указывает на то, что предыдущая операция отправки привела к сообщению ICMP Port Unreachable.
Что означает ваш призыв к sendto()
терпит неудачу. Это имеет смысл, если один или оба клиента находятся за маршрутизатором. Исходя из вашего описания (и отсутствия кода), вы на самом деле не выполняете пробивки дырок, чтобы открыть маршрутизатор (-ы) для пропуска пакетов от клиента к клиенту. Вы только отправили сообщение на свой сервер, что позволяет передавать пакеты клиент-сервер и сервер-клиент. Для выполнения пробивки отверстий на каждом конце требуется еще несколько обменов пакетами между каждым клиентом и сервером, как подробно описано в статья, на которую вы ссылаетесь. Вы действительно делаете то, что говорится в статье?
Других решений пока нет …