Что касается метода C# и .NET System.Net.Sockets.Socket.AcceptAsync
, то потребуется обработать возвращаемое значение «false», чтобы обрабатывать сразу доступное состояние SocketAsyncEventArgs
от синхронно обработанного соединения. Microsoft предоставляет примеры (найденные на странице класса System.Net.Sockets.SocketAsyncEventArgs
), что приведет к переполнению стека, если существует большое количество ожидающих подключения соединений, которые могут быть использованы в любой системе, которая реализует свою модель обработки.Переполнение стека при использовании System.Net.Sockets.Socket.AcceptAsync модели
Другие идеи для решения этой проблемы состоят в том, чтобы создать цикл, который вызывает метод обработчика, при условии, что значение Socket.AcceptAsync
возвращает значение false и разбить цикл (чтобы разрешить отложенную обработку), если значение указывает, что операция выполняется асинхронно (true). Однако это решение также вызывает уязвимость переполнения стека из-за того, что обратный вызов, связанный с SocketAsyncEventArgs
, переданный в Socket.AcceptAsync
, имеет в конце метода вызов Socket.AcceptAsync
, который также имеет цикл для сразу доступных, синхронно принятых соединений ,
Как вы можете видеть, это довольно солидная проблема, и мне еще предстоит найти хорошее решение, которое не связано с System.Threading.ThreadPool
и созданием множества других методов и обработки планирования. Насколько я вижу, асинхронная модель сокета, относящаяся к Socket.AcceptAsync
, требует больше, чем показано в примерах в MSDN.
У кого-нибудь есть чистое и эффективное решение для обработки сразу ожидающих соединений, которые синхронно принимаются от Socket.AcceptAsync, не вступая в создание отдельных потоков для обработки соединений и без использования рекурсии?
Да, примеры на MSDN не всегда является лучшим (или лучшей практики, по этому вопросу). Вы можете уточнить свой вопрос? Вы ищете способ работы с asyc сокетами, которые не вызовут StackOverflowExceptoin? – Oded
Это правильно; Я ищу нерекурсивный способ обработки сразу ожидающих соединений. –
См. Также http://stackoverflow.com/questions/2002143/asynchronous-sockets-handling-false-socket-acceptasync-values – Lucero