Какова цель использования sendto / recvfrom вместо connect / send / recv с UDP-сокетами? - PullRequest
17 голосов
/ 31 мая 2011

Я могу понять концепцию TCP против UDP, но все же я не понимаю, почему есть 2 способа отправки пакетов UDP, и с этим я все еще не понимаю, является ли это абсолютно необходимым для bind () и accept ( ) ...

Ответы [ 2 ]

34 голосов
/ 01 июня 2011
  1. accept() для TCP. Это не имеет ничего общего с UDP.

  2. connect() в UDP ничего не делает для другого конца, он просто заставляет локальный API знать, кому вы отправляете и получаете.

  3. Если вы этого еще не знаете, или вам все равно, или вы хотите отправлять сообщения нескольким получателям с одним и тем же сокетом, вы не используете connect(), вместо этого вы используете sendto(). Аналогично для получения.

    Рассмотрим, например, сервер UDP. Он вызвал бы recvfrom(),, чтобы получить информацию об адресе источника, обработать запрос, создать ответ и отправить его по этому адресу через sendto(). без connect() где-либо задействованного, поэтому невозможно использовать send() или recv().

  4. Требуется только bind() сервер, потому что клиентам нужен фиксированный номер порта для отправки. Клиенту вообще не нужно bind(): автоматическое связывание () будет выполнено для первого send()/sendto()/recv()/recvfrom() с использованием назначенного системой номера локального порта.

12 голосов
/ 14 июня 2011

Важно понимать, что TCP ориентирован на соединение, а UDP - это протокол без установления соединения.

  • TCP: сначала необходимо подключиться перед отправкой / получением данных на / с удаленного хоста..
  • UDP: Соединение не требуется.Вы можете отправлять / получать данные на / с любого хоста.

Обычно вы будете использовать sendto() на сокете UDP для указания пункта назначения.Точно так же вы обычно используете recvfrom(), чтобы узнать, откуда были получены данные UDP.

Однако вы можете использовать connect() для сокета UDP в качестве опции.В этом случае вы можете использовать send()/recv() на сокете UDP для отправки данных на адрес, указанный в connect(), и для получения данных только с адреса.(connect() на сокете UDP просто устанавливает адрес однорангового узла по умолчанию, и вы можете вызывать connect() на сокете UDP столько раз, сколько вы хотите, а connect() на сокете UDP, конечно, не выполняет никакого установления связи для соединения.)

Надеюсь, это поможет.

...