Как прочитать точное количество байтов из сокета потока (tcp)? - PullRequest
0 голосов
/ 16 ноября 2009

В winsock синхронизация recv и асинхронизация WSARecv завершаются, как только в потоковом сокете появляются данные, независимо от указанного размера (который является только верхним пределом). Это означает, что для считывания фиксированного количества байтов из потока должна применяться некоторая пользовательская буферизация. И если каждое чтение не буферизуется отдельно, это приводит к двойной буферизации, то есть фактически существует два буфера на сокет.

Есть ли способ попросить winsock буферизовать данные от своего имени и завершить операцию только тогда, когда станет доступно указанное количество байтов (если не происходит ошибка)?

РЕДАКТИРОВАТЬ: Эта функция должна работать, в частности, для асинхронных сокетов.

1 Ответ

4 голосов
/ 16 ноября 2009

Для синхронных сокетов вы должны быть в состоянии передать флаг MSG_WAITALL в recv, который будет блокироваться, пока ваш буфер не заполнится или не произойдет ошибка / отключение.

Что касается перекрывающихся io, то не совсем. Ваш единственный реальный вариант - буферизовать данные. Вам не нужны два буфера для этого; Вы можете использовать тот же буфер и просто передать буфер + смещение конца последнего чтения, пока буфер не будет заполнен.

...