С сокетами TCP TCP может ли 'send' вернуть ноль? - PullRequest
16 голосов
/ 21 июня 2010

Может ли функция C send когда-либо возвращать ноль при использовании TCP-сокетов?Страница man просто говорит, что она вернет количество отправленных байтов, но я не уверен, что она просто вернет -1, если не может отправить какие-либо данные.

Ответы [ 5 ]

17 голосов
/ 21 июня 2010

Я почти уверен, что хотя память глубоко в глубине веков, я видел, что она возвращала ноль раньше, в ситуации массовой передачи данных, когда другой конец не успевал.

В этом случае из памяти буферы удаленного стека TCP были заполнены, стек уведомил локальный конец о том, что следует задержать, пока не будет очищено некоторое пространство и не заполнены и локальные буферы.

В этот момент технически это не ошибка (следовательно, -1 не возвращается), но локальный стек не может принять данные.

Я не полностью уверен, что это тактеперь, поскольку текущий стандарт Posix, кажется, указывает, что он просто заблокируется в этом случае (или потерпит неудачу, если он настроен на неблокирование).

Однако я подозреваю, что это спорный вопрос.У вас do есть вероятность, что он вернет на меньше байт, которые вы запросили отправить, и поэтому у вас должен быть код для этого.

И, так какэто будет в значительной степени та же логика обработки «на единицу меньше, чем запрошено», что и обработки «нулевых байтов», вы также можете предположить, что она может вернуть ноль.

4 голосов
/ 21 июня 2010

Ну, всегда есть случай, когда вы передали ноль в качестве количества байтов для отправки ... в этом случае "возврат количества отправленных байтов" будет означать, что он должен вернуть ноль байтов.

Вероятно, в любом случае лучше всего правильно обработать регистр с нулем возврата; это не может повредить, и это может помочь.

3 голосов
/ 21 июня 2010

Ответ на этот вопрос может зависеть от реализации и, следовательно, различаться в зависимости от операционной системы.

Одно обстоятельство, при котором ожидается 0, когда вы запрашиваете передачу 0 байтов.

1 голос
/ 28 февраля 2016

Страница состояния BSD man :

Если в сокете нет места для хранения сообщения, подлежащего передаче, то send () обычно блокируется, если сокет не был переведен в неблокирующий режим ввода / вывода.

Спецификация Posix идет дальше и утверждает, что в режиме блокировки все данные передаются, если не происходит прерывание.

В обоих случаях ноль не может быть возвращен, если только счетчик не был равен нулю.

0 голосов
/ 17 октября 2018

Я сейчас наблюдаю нулевой возврат из send(2) на сокете типа AF_UNIX.

Да, это было связано с полем size нулевого значения.

Итак, JFYI.

...