Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

В справочной странице BSD указано:

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

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

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