Я прочитал документацию по крайней мере 10 раз, а также прочитал около 10 или около того фрагментов кода и полных программ, в которых для отправки данных используются неблокирующие сокеты. Проблема в том, что некоторые уроки предназначены либо для начинающих (Beejs f.i.), либо довольно небрежны в своих предположениях; а те, которые не сложны, представляют собой специализированные примеры кода, которые не объясняют, почему они делают то, что делают. На мой взгляд, даже база знаний SO не полностью охватывает всю гамму поведения send
. Что мне нужно, так это подробности о f.e:
- На что именно указывает код возврата 0, и стоит ли тогда проверять
errno
или следует просто отказаться от соединения без дальнейшего расследования? - Гарантирует ли получение отрицательного возвращаемого значения закрытие испорченного соединения или только так, если только
errno
не являетсяEWOULDBLOCK
,EAGAIN
илиEINTR
(...другие)? - Стоит ли проверять
errno
, когда возвращаемое значение равно> 0
? По-видимому, значение указывает на количество «отправленных» данных (в кавычках, потому что это действительно долгий процесс, верно), но, поскольку сокет неблокирующий, означает ли это, что можно сразу же выполнить другой вызов или, в зависимости отerrno
снова , следует дождаться следующего случая отправки (используя select/poll/epoll)? - В принципе, сначала проверяется возвращаемое значение, а затем значение
errno
? Или, может быть,send
устанавливаетerrno
при каждом вызове, независимо от возвращаемого значения? Это сделало бы проверку ошибок несколько проще... - Если кто-то получит
EINTR
, что будет хорошим, надежным поведением для программы? Просто запишите состояние и повторите попытку при следующей отправке, например, сEWOULDBLOCK
иEAGAIN
? - Нужно ли проверять оба
EWOULDBLOCK
иEAGAIN
? Можем ли мы доверять обоим, имеющим одинаковое значение, или это зависит от реализации? send
возвращаетEMSGSIZE
для потоковых сокетов? Если это не так, то размер буфера не слишком велик, верно?- Может ли возвращаемое значение быть равным любому из известных кодов ошибок?
Если бы вы могли привести пример надежного неблокирующего кода отправки, это было бы очень признательно.