POSIX: Возвращаемое значение из write () на сокете UDP - PullRequest
0 голосов
/ 21 мая 2018

В системе POSIX, если sock_fd является сокетом UDP, write(sock_fd, data, size) всегда будет возвращать size или -1?Т.е., если write() не завершится с ошибкой, запрошенный фрагмент данных всегда будет записан полностью, подразумевая, что, если возвращаемое значение не равно -1, тогда я могу всегда игнорировать фактическое возвращаемое значение?

Мне кажется, что так и должно быть, но ни одна справочная страница, по-видимому, не говорит об этом четко.

РЕДАКТИРОВАТЬ: Я предполагаю, что есть два возможных ответа.Либо оно где-то указано, но я его не нашел, либо есть какой-то неясный угловой случай, который позволяет возвращаемому значению быть меньше запрошенного размера.

Ответы [ 3 ]

0 голосов
/ 21 мая 2018

В отличие от TCP и других транспортов, UDP работает только с целыми дейтаграммами.

Возвращаемое значение write() / send() / sendto() - это количество байтов, принятых ядром для отправки.Просто при отправке дейтаграммы по протоколу UDP целая дейтаграмма отправляется за один раз или вообще ничего не отправляется.Таким образом, возвращаемое значение всегда будет полным размером дейтаграммы в случае успеха или -1 в случае неудачи.Между ними нет.

То же самое с получением.Возвращаемое значение read() / recv() / recvfrom() - это количество байтов, считанных в буфер пользователя.Просто при получении дейтаграммы по UDP вы либо получаете целую дейтаграмму за один раз (и если ваш буфер слишком мал, датаграмма будет усечена), либо вы вообще ничего не получите.Таким образом, возвращаемое значение всегда будет размером дейтаграммы, скопированной в ваш буфер при успехе, или -1 при ошибке.Между ними нет (конечно, не считая возможности заглянуть без чтения).

0 голосов
/ 22 мая 2018

UDP RFC оставляет детали реализации открытыми:

Один возможный интерфейс UDP / IP вернул бы всю интернет-дейтаграмму, включая весь интернет-заголовок, в ответ на получениеоперация.Такой интерфейс также позволил бы UDP передавать полную интернет-дейтаграмму с заголовком в IP для отправки.

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

Сказав это, я не знаю ни одной реализации UDP, которая бы обрабатывала частичные дейтаграммы.

0 голосов
/ 21 мая 2018

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

Так что обрабатывайте его так, как если бы оно могло вернуть что-либо, и у вас не возникнет проблем.

Даже если вы просто сообщаете об ошибке в журнале или прерываете программу, ПРОВЕРЬТЕ ВОЗВРАТ .

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