Когда send () возвращает EWOULDBLOCK / EAGAIN, возможно ли, чтобы он записал частичные байты? - PullRequest
0 голосов
/ 04 августа 2020

Когда send() возвращает EWOULDBLOCK / EAGAIN, возможно ли, чтобы он записал неполные байты? Или это поведение atomi c ... либо он записал все байты, либо ничего не записал?

Может ли send() записать частичные байты (не полные) и вернуть успех?

Ответы [ 2 ]

0 голосов
/ 04 августа 2020

Если send() возвращает <0, будь то для <code>EWOULDBLOCK / EAGAIN или любой другой ошибки, то байты 1 вообще не принимаются для отправки. Если бы какие-либо байты были приняты, возвращаемое значение send() было бы> 0, чтобы сообщить фактическое количество байтов.

1: Я говорю принято , потому что фактическая передача делается в фоновом режиме на досуге ядра. send() просто помещает байты в исходящий буфер сокета, чтобы ядро ​​могло передать их позже.

Возможность частичной отправки зависит от типа сокета.

Потоковый сокет, как и TCP, допускает частичную отправку, да. Он займет столько байтов, сколько может, и вернет, сколько байтов было фактически занято, если не возникнет ошибка.

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

0 голосов
/ 04 августа 2020

Для send() возможно записывать частичные данные в сокет потока. Однако в этом случае он не установит errno в EWOULDBLOCK / EAGAIN.

errno устанавливается только тогда, когда send() возвращает -1, что означает, что в все. Это будет EWOULDBLOCK / EAGAIN, если причина невыполнения записи заключается в отсутствии доступного буферного пространства.

send() возвращает количество записанных байтов. Если он записывает частичные данные, возвращаемое значение будет меньше, чем количество запрошенных байтов.

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