Я почти уверен, что хотя память глубоко в глубине веков, я видел, что она возвращала ноль раньше, в ситуации массовой передачи данных, когда другой конец не успевал.
В этом случае из памяти буферы удаленного стека TCP были заполнены, стек уведомил локальный конец о том, что следует задержать, пока не будет очищено некоторое пространство и не заполнены и локальные буферы.
В этот момент технически это не ошибка (следовательно, -1 не возвращается), но локальный стек не может принять данные.
Я не полностью уверен, что это тактеперь, поскольку текущий стандарт Posix, кажется, указывает, что он просто заблокируется в этом случае (или потерпит неудачу, если он настроен на неблокирование).
Однако я подозреваю, что это спорный вопрос.У вас do есть вероятность, что он вернет на меньше байт, которые вы запросили отправить, и поэтому у вас должен быть код для этого.
И, так какэто будет в значительной степени та же логика обработки «на единицу меньше, чем запрошено», что и обработки «нулевых байтов», вы также можете предположить, что она может вернуть ноль.