С сокетами TCP C, может 'отправить' нуль возврата?

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

16
задан Adrian 21 June 2010 в 03:27
поделиться

3 ответа

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

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

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

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

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

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

17
ответ дан 30 November 2019 в 21:36
поделиться

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

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

4
ответ дан 30 November 2019 в 21:36
поделиться

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

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

3
ответ дан 30 November 2019 в 21:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: