WSARecv и WSABuf вопросы - PullRequest
       5

WSARecv и WSABuf вопросы

1 голос
/ 14 февраля 2011

У меня есть несколько вопросов относительно WSARecv

Вопрос 1: Как мне точно определить, какой размер мы должны присвоить WSABUF.len?

Вопрос 2: WSARecv читает данные с длиной 0?

например. WSABUF.len = 0

Я хочу использовать это, чтобы использовать это, чтобы определить, все ли пакеты отправлены.

Вопрос 3: Если я правильно понимаю, lpNumberOfBytesRecvd содержит количество фактически прочитанных байтов, а не WSABUF.len, верно?

Спасибо.

1 Ответ

6 голосов
/ 14 февраля 2011

1) WSABUF.len - длина предоставленного вами буфера. Это максимальная сумма, которую можно прочитать в этом звонке. Вы знаете этот размер, так как это размер памяти, выделенной для буфера, на который указывает WSABUF.buf.

2) В определенных ситуациях с высокой производительностью и многими тысячами одновременных подключений при использовании асинхронного ввода-вывода можно установить значение WSABUF.len равным 0, чтобы запретить чтение, за исключением завершения, сообщающего, что данные доступны. Это настройка производительности, которая редко требуется и часто упоминается как «чтение нулевого байта». Это полезно потому, что это означает, что системе ввода-вывода не нужно блокировать буфер чтения в памяти (нет буфера чтения), что уменьшает количество заблокированных страниц ввода-вывода. Существует фиксированное ограничение на количество страниц ввода / вывода, которые могут быть заблокированы, и это может быть полезно, когда у вас много тысяч соединений, но они не очень часто отправляют данные. Вы отправляете чтение нулевого байта на все соединения, а затем публикуете реальное чтение, когда чтение нулевого байта завершается, и вы знаете, что у вас есть доступные данные.

3) Да. Количество фактически прочитанных байтов возвращается отдельно через lpNumberOfBytesRecvd.

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

...