Может ли кто-нибудь дать мне хорошее объяснение поведения «отправки» для неблокирующих сокетов?

Я прочитал документацию по крайней мере 10 раз, а также прочитал около 10 или около того фрагментов кода и полных программ, в которых для отправки данных используются неблокирующие сокеты. Проблема в том, что некоторые из руководств либо для начинающих (Beejs fi), либо довольно небрежны в своих предположениях; а те, которые не являются сложными, представляют собой специализированные примеры кода, которые не объясняют, почему они делают то, что делают. На мой взгляд, даже база знаний SO не полностью охватывает весь спектр поведения send . Что мне нужно, так это подробности о fe:

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

Если бы вы могли предоставить пример надежного неблокирующего кода отправки, это было бы абсолютно признательно.

6
задан amn 11 July 2016 в 15:06
поделиться