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