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