Проблема с использованием Connect (), send (), recv, с UDP-сокетами - PullRequest
4 голосов
/ 20 декабря 2010

Для моего задания Uni я должен создать сетевую игру с быстрым темпом и поэтому решил использовать UDP, а не TCP. Мне известно о многих различиях в программировании как UDP, так и TCP, и я прочитал большинство соответствующих частей документации MSDN по winsock. В MSDN говорится, что создание UDP-сокета с помощью функции connect () должно связывать сокет с указанным адресом и портом, и в результате можно использовать функции send () и recv () с созданным сокетом.

Для моего приложения я создаю клиента и использую connect (), используя адрес обратной связи, который отправляет несколько пакетов с помощью функции send (). После вызова select () клиент получает пакеты, которые он отправил. Однако результат, который я получаю от функции recv () - SOCKET_ERROR, а описание ошибки с использованием WSAGetLastError () - «Существующее соединение было принудительно закрыто удаленным хостом».

Если я использую функцию bind () и использую sendto () для отправки данных по адресу обратной связи, я получаю пакеты recv () без каких-либо ошибок ... Кто-нибудь знает, почему функция connect () не выполняет своих функций? должен был сделать, и кто-нибудь смог использовать UDP-сокеты с функцией connect ()?

Ответы [ 4 ]

14 голосов
/ 20 декабря 2010

Вам нужно будет вызвать bind (), если вы хотите, чтобы ваша программа принимала пакеты UDP. connect () устанавливает только адрес, на который сокет будет отправлять пакеты, если вы вызовите send (); он не связывает сокет с локальным портом UDP для приема; для этого вы должны вызвать bind ().

4 голосов
/ 25 июня 2016

«Сетевое программирование UNIX» указывает на то, что вызов подключения, выполненный на сокете UDP-стороны клиента, заранее определяет и сохраняет все состояние об адресе сокета назначения (маскирование, выбор интерфейса и т. Д.), Что снижает затраты на выполнение. так на каждом вызове :: sendto. В этой книге утверждается, что :: send vs :: sendto может быть до 3x быстрее из-за этого уменьшенных накладных расходов - данные могут идти прямо к драйверу NIC, минуя большую часть обработки стека IP. Высокопроизводительные программисты игр могут подумать об этом.

1 голос
/ 20 декабря 2010

Вы должны проверить Руководство Beej по сетевому программированию с использованием интернет-сокетов , есть хорошие примеры, которые касаются вашего вопроса.

0 голосов
/ 15 октября 2013

Имейте в виду, что протокол UDP является протоколом без соединения , означающим, что вы никогда не подключаетесь к хосту, вы просто отправляете данные. Таким образом, вы можете видеть, что подключение как действие не имеет смысла для UDP.

Для UDP вы должны использовать sendto () и recvfrom (), в этих функциях вы указываете адрес и буферы, и это все, все остальное, что удобно для вас обрабатывается в TCP, ушло, вы должны обрабатывать вещи самостоятельно .

В документации MSDN упоминается, что на самом деле вы можете каким-то образом использовать обычные функции send / recv с UDP, но зачем вам, когда у вас уже есть отдельные функции? Как и другие уже прокомментированные, connect () для UDP делает что-то еще, это по сути не операция «подключения», а своего рода фильтр для настройки send () / recv () для использования UDP.

...