Estouro de pilha ao usar o modelo System.Net.Sockets.Socket.AcceptAsync
Com relação a C # e .NETSystem.Net.Sockets.Socket.AcceptAsync
método, seria necessário manipular um valor de retorno "false" para manipular o valor imediatamente disponívelSocketAsyncEventArgs
estado da conexão processada de forma síncrona. A Microsoft fornece exemplos (encontrados noSystem.Net.Sockets.SocketAsyncEventArgs
classe) que causará um estouro de pilha se houver uma grande quantidade de conexões pendentes, que podem ser exploradas em qualquer sistema que implemente seu modelo de manipulação.
Outras idéias para contornar esse problema são criar um loop que chama o método manipulador, com a condição de que o valorSocket.AcceptAsync
retornos é igual a false e interrompe o loop (para permitir processamento adiado) se o valor estiver indicando que a operação está sendo concluída de forma assíncrona (true). No entanto, essa solução também causa uma vulnerabilidade de estouro de pilha devido ao fato de o retorno de chamada associado aoSocketAsyncEventArgs
passado paraSocket.AcceptAsync
no final do método, uma chamada paraSocket.AcceptAsync
, que também possui um loop para conexões imediatamente disponíveis e aceitas de forma síncrona.
Como você pode ver, esse é um problema bastante sólido e ainda não encontrei uma boa solução que não envolvaSystem.Threading.ThreadPool
e criando vários outros métodos e agendamento de processamento. Tanto quanto posso ver, o modelo de soquete assíncrono relacionado aSocket.AcceptAsync
requer mais do que é demonstrado nos exemplos no MSDN.
Alguém tem uma solução limpa e eficiente para lidar com conexões imediatamente pendentes que são aceitas de forma síncrona a partir do Socket.AcceptAsync sem precisar criar threads separados para lidar com as conexões e sem utilizar recursão?