всегда ли recv возвращает одинаковое количество данных, переданных для отправки? - PullRequest
0 голосов
/ 08 июля 2019

Если у меня есть два сокета (AF_INET, SOCK_STREAM, IPPROTO_IPV4), соединенных вместе, и я выдаю send() 32 байта на одном конце, это операция recv(), которая читает данные на другом концеend гарантированно вернет одинаковое количество данных за один вызов?

1 Ответ

2 голосов
/ 08 июля 2019

Нет, такой гарантии нет.Фактически, по умолчанию, несколько последовательных коротких записей будут объединены в один сетевой пакет, который будет получен в одном recv().(Это известно как алгоритм Нейгла .)

Если данные, которые вы передаете, должны быть сформированы определенным образом, вам нужно будет включить данные, чтобы определить это кадрирование как частьданные, которые вы передаете.Один простой подход заключается в разделении ваших данных специальным символом, например, новой строкой или нулевым байтом;другой - передавать длину каждого кадра перед его данными.(Существует много других способов кадрировать данные; это всего лишь несколько идей для начала.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...