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