Работа с ошибкой sendto для сокета UDP - PullRequest
1 голос
/ 14 октября 2010

Если sendto не работает в соответствии с man-страницей

"В случае успеха эти вызовы возвращают количество отправленных символов. В случае ошибки возвращается -1 и значение errno устанавливается соответствующим образом."

Я знаю, что с TCP это определенно так, и вам действительно следует попытаться отправить оставшиеся данные, как указано в руководстве Биджа по сетевому программированию.

Однако частичная отправка пакета UDP не имеет смысла для меня, и этот комментарий, похоже, подразумевает это.

Если сообщение слишком длинное для атомарной передачи через базовый протокол, возвращается ошибка EMSGSIZE и сообщение не передается.

Может ли кто-нибудь подтвердить для меня, что если я вызову sendto (или send) с UDP-пакетом, что, если он на самом деле не помещается в исходящем буфере, я получу -1, возвращенное с errno, установленным в EMSGSIZE, и без частичной отправки как с потоковым (TCP) сокетом?

Ответы [ 2 ]

3 голосов
/ 16 октября 2010

Скрытого смысла нет, функция просто возвращает количество отправленных байтов. Это стандартный шаблон для API Unix. Дейтаграммы являются доставкой «все или ничего», получение усложняется, если сеть вызвала фрагментацию, но обычно стек скрывает все детали и представляет каждый полный пакет при его реконструкции.

1 голос
/ 16 октября 2010

EMSGSIZE указывает, что «сокет требует, чтобы сообщение было отправлено атомарно, но размер сообщения, которое необходимо отправить, делает это невозможным» (см. man sendto ).

Однако,переполнение исходящего буфера не обязательно является причиной - Linux (например) явно не будет фрагментировать пакеты UDP по умолчанию (см. man udp ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...