Возможно ли, чтобы функция C send
возвращала ноль при использовании сокетов TCP? На странице руководства просто сказано, что он вернет количество отправленных байтов, но я не уверен, что он просто вернет -1, когда он не сможет отправить какие-либо данные.
С C сокетами TCP можно "отправить" возврат ноль?
Ответ 1
Я почти уверен, хотя память глубоко в тумане времени, что я видел, как он возвращал ноль раньше, в ситуации массовых передач данных, где другой конец не поддерживался.
Из памяти в этом случае буферы удаленных TCP-стеков заполнились, стек уведомил локальный конец о том, что он должен был задерживаться до тех пор, пока некоторое пространство не будет очищено, и локальные буферы также заполнили бы.
В этот момент это не технически ошибка (следовательно, нет -1 возвращена), но никакие данные не могут быть приняты локальным стеком.
Я не совсем уверен, что случай, когда текущий стандарт Posix, похоже, указывает, что он просто заблокирует в этом случае (или не сработает, если он настроен для неблокирования).
Однако, я подозреваю, что это спорный вопрос. У вас есть вероятность, что он вернет меньше, чем байты, которые вы просили отправить, и поэтому у вас должен быть код для обработки этого.
И так как это будет почти такая же логическая обработка "меньше, чем вы запросили", как обработку "нулевых байтов", вы можете также предположить, что она может вернуть нуль.
Ответ 2
Ну, всегда есть случай, когда вы передали в нуль число байтов для отправки... в этом случае "возврат количества отправленных байтов" означает, что он должен вернуть нулевые байты.
Вероятно, лучше всего обрабатывать случай с обратным нулем в любом случае; это не может повредить, и это может помочь.
Ответ 3
Ответ на этот вопрос может быть зависимым от реализации и поэтому зависит от операционной системы.
Одно обстоятельство, в котором ожидалось бы 0, когда вы запрашиваете передачу 0 байтов.
Ответ 4
В справочной странице BSD указано:
Если в гнезде нет места для хранения сообщения, которое необходимо передать, то send() обычно блокирует, если сокет не был помещен в неблокирующий режим ввода/вывода.
Спецификация Posix идет дальше и заявляет, что в режиме блокировки все данные передаются, если не происходит прерывание.
В обоих случаях ноль не может быть возвращен, если только счетчик не был равен нулю.