Ограничение асинхронных сокетов .Net? - PullRequest
1 голос
/ 28 февраля 2011

Являются ли незавершенные асинхронные операции ценным ресурсом, который следует использовать с осторожностью?

У меня есть множество подключенных TcpClients, от которых я не ожидаю ввода, но на случай, если один из них ведет себя неправильно, мне нужно сохранитьвходные буферы пусты.Если у меня есть BeginRead () для каждого подключенного клиента, который остается открытым на неопределенное время, есть ли вред?Обратный вызов будет вызван, когда клиент в конце концов закроется, и я могу просто вернуться из него, если! AsyncResult.IsCompleted.

Я не знаю, сколько байтов нужно начать читать, хотя я полагаю, что могу поделиться однимбуфер.Ввод до этого предела буфера может просто сидеть в потоке, непрочитанный.Есть ли лучший способ эффективно отбросить, запретить или ПОДОЖДИТЬ доступность данных в потоке?

В противном случае мне нужно опросить доступные данные.

Спасибо!

Ответы [ 2 ]

3 голосов
/ 28 февраля 2011

Это зависит от операционной системы, на которой вы работаете ...

Ожидающее recv будет использовать не выгружаемый пул, что приведет к блокировке некоторых страниц памяти для ввода-вывода.

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

Другим ресурсом, который используется в ожидании recv, является одна или несколько страниц памяти, заблокированных для ввода-вывода, пока выполняется операция. Существует конечное ограничение на количество страниц, которые МОГУТ быть заблокированы, и поэтому, опять же, вы можете получить «ENOBUFS» от базовой системы ввода-вывода при определенных обстоятельствах.

Конечно, это зависит от того, сколько у вас связей, влияют ли эти ограничения на вас или нет.

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

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

Нет, это не так.Помимо сокета, который вы все равно используете, асинхронная операция использует событие - самый легкий объект ядра - и структуру OVERLAPPED, то есть несколько слов памяти.Я ожидаю, что у вас закончатся сокеты задолго до того, как у вас кончатся события или память.

Похоже, не существует механизма ожидания данных без их чтения в .NET (основной Win32API позволяет это сделать, см. WSAEventSelect), поэтому вам придется прочитать 1 байт.Совместное использование одного большого буфера между несколькими сокетами, чтение с различными смещениями может быть целесообразным, поскольку любой буфер, используемый для асинхронного ввода-вывода, должен оставаться закрепленным до завершения ввода-вывода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...