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