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