Это зависит от операционной системы, на которой вы работаете ...
Ожидающее recv будет использовать не выгружаемый пул, что приведет к блокировке некоторых страниц памяти для ввода-вывода.
До появления Windows Vista пул невыгружаемого хранилища был довольно пугающим, и это был продукт для всей машины, который может привести к сбою плохо спроектированных драйверов, если он исчерпал себя ... Так что в ОС до Vista вы можете получить ошибки ENOBUFS из-за перекрывающейся системы ввода-вывода из-за отсутствия невыгружаемого пула. См. Здесь: http://www.lenholgate.com/blog/2009/03/excellent-article-on-non-paged-pool.html для более подробной информации о лимитах невыгружаемого пула.
Другим ресурсом, который используется в ожидании recv, является одна или несколько страниц памяти, заблокированных для ввода-вывода, пока выполняется операция. Существует конечное ограничение на количество страниц, которые МОГУТ быть заблокированы, и поэтому, опять же, вы можете получить «ENOBUFS» от базовой системы ввода-вывода при определенных обстоятельствах.
Конечно, это зависит от того, сколько у вас связей, влияют ли эти ограничения на вас или нет.
«Стандартный» способ справиться с ограничением количества заблокированных страниц ввода-вывода в неуправляемом коде - это отправка нулевых байтовых чтений, то есть чтений, имеющих буферы, которые на самом деле имеют длину 0 байтов. Это означает, что во время отложенного чтения буферное пространство не блокируется, а когда оно завершается, вы просто отправляете обычное чтение или читаете синхронно.