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