Con respecto al método System.Net.Sockets.Socket.AcceptAsync
de C# y .NET, se necesitaría uno para manejar un valor devuelto de "falso" para manejar el estado SocketAsyncEventArgs
inmediatamente disponible desde la conexión procesada sincrónicamente. Microsoft proporciona ejemplos (que se encuentran en la página de la clase System.Net.Sockets.SocketAsyncEventArgs
) que causarán un desbordamiento de la pila si hay una gran cantidad de conexiones pendientes, que pueden explotarse en cualquier sistema que implemente su modelo de manejo.Desbordamiento de pila al utilizar el modelo System.Net.Sockets.Socket.AcceptAsync
Otras ideas para evitar este problema son crear un bucle que llama al método del controlador, con la condición de que el valor Socket.AcceptAsync
devuelve es igual a falso y romper el bucle (para permitir el procesamiento diferido) si el valor indica que la operación se está completando de forma asíncrona (verdadera). Sin embargo, esta solución también causa una vulnerabilidad de desbordamiento de pila debido al hecho de que la devolución de llamada asociada con SocketAsyncEventArgs
pasada a Socket.AcceptAsync
tiene al final del método, una llamada a Socket.AcceptAsync
, que también tiene un bucle para conexiones inmediatamente disponibles, sincronizadas aceptadas .
Como puede ver, este es un problema bastante sólido, y aún no he encontrado una buena solución que no implique System.Threading.ThreadPool
y la creación de toneladas de otros métodos y el procesamiento de la programación. Por lo que puedo ver, el modelo de socket asíncrono relacionado con Socket.AcceptAsync
requiere más de lo que se demuestra en los ejemplos en MSDN.
¿Alguien tiene una solución limpia y eficiente para manejar conexiones inmediatamente pendientes que se aceptan sincrónicamente desde Socket.AcceptAsync sin tener que crear subprocesos separados para manejar las conexiones y sin utilizar la recursión?
Sí, los ejemplos de MSDN no son siempre la mejor (o las mejores prácticas, para el caso). ¿Puedes aclarar tu pregunta? ¿Estás buscando una forma de trabajar con conectores asyc que no causen StackOverflowExceptoin? – Oded
Eso es correcto; Estoy buscando una forma no recursiva para manejar conexiones inmediatamente pendientes. –
Véase también http://stackoverflow.com/questions/2002143/synchronous-sockets-handling-false-socket-acceptasync-values – Lucero