Когда неблокирующая функция send () передает только частичные данные, можем ли мы предположить, что она вернет EWOULDBLOCK при следующем вызове?

Два случая хорошо документированы на страницах руководства для неблокирующих сокетов:

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

Что не документировано для неблокирующих сокетов:

Если send () возвращает положительное значение меньше размера буфера.

Можно ли предположить, что send () вернет EAGAIN / EWOULDBLOCK еще на один байт данных? Или должна ли неблокирующая программа попытаться отправить () еще раз, чтобы получить окончательный EAGAIN / EWOULDBLOCK? Я беспокоюсь о том, чтобы поместить в сокет наблюдатель EPOLLOUT, если он фактически не находится в состоянии «заблокировано», чтобы реагировать на его выход.

Очевидно, что последняя стратегия (повторная попытка получить что-то убедительное) имеет четко определенное поведение, но она более многословна и наносит удар по производительности.

Ответы на вопрос(2)

Ваш ответ на вопрос