2009-11-15 3 views
0

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

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

EDIT: Эта функция должна работать, в частности, для асинхронных сокетов.

ответ

4

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

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

+0

Кажется, это решение для блокировки сокетов, но в соответствии с MSDN оно не поддерживается для асинхронных сокетов. см. редактирование. – sold

+0

Я обновил свой ответ соответственно. – Gerald