recv вернул меньше байт, чем клиент отправил одним вызовом send
Сервер на POSIX-сокетах принимает сообщения от клиента. Клиент отправляет 4000 байт одним вызовом send. Сервер вызывает recv с буфером на 8192 байта и получает 1460 байт, остальное приходит следующими вызовами.
Как правильно интерпретировать это поведение?
- TCP — поток байт без границ сообщений: читать надо в цикле, накапливая данные до длины из своего протокола
- Буфер сервера слишком мал, его нужно увеличить хотя бы до размера самого большого сообщения протокола
- Клиент обязан отправлять сообщение целиком одним пакетом, значит ошибка на его стороне и чинить нужно клиента
- Сокет нужно перевести в блокирующий режим, тогда recv дождётся и вернёт всё сообщение целиком за один вызов
