Два случая са добре документирани в man страниците за неблокиращи сокети:
- Ако send() върне същата дължина като буфера за прехвърляне, цялото прехвърляне е приключило успешно и сокетът може или не може да бъде в състояние на връщане EAGAIN/EWOULDBLOCK на следващото извикване с >0 байта към трансфер.
- Ако send() върне -1 и errno е EAGAIN/EWOULDBLOCK, нито едно прехвърляне не е приключило и програмата трябва да изчака, докато сокетът е готов за повече данни (EPOLLOUT в случай на epoll).
Това, което не е документирано за неблокиращи сокети е:
- Ако send() връща положителна стойност, по-малка от размера на буфера.
Безопасно ли е да се предположи, че send() ще върне EAGAIN/EWOULDBLOCK дори още един байт данни? Или трябва неблокираща програма да опита да изпрати() още веднъж, за да получи окончателен EAGAIN/EWOULDBLOCK? Притеснявам се да поставя наблюдател на EPOLLOUT на сокета, ако той всъщност не е в състояние „ще блокира“, за да реагира на излизането му.
Очевидно последната стратегия (опитвайки се отново да получи нещо убедително) има добре дефинирано поведение, но е по-подробна и оказва удар върху производителността.
EWOULDBLOCK
(или как обикновено работят неблокиращите сокети в по-голямата си част), така че според мен е сигурен залог, че формулировката ще блокира, което изглежда ви обърка, е просто лоша формулировка, но не и това, което е предвидено. - person Damon   schedule 16.10.2013