【发布时间】:2010-10-17 18:37:14
【问题描述】:
对于 C# 和 .NET 的 System.Net.Sockets.Socket.AcceptAsync 方法,需要处理“false”的返回值,以便从同步处理的连接中处理立即可用的 SocketAsyncEventArgs 状态。 Microsoft 提供了示例(在System.Net.Sockets.SocketAsyncEventArgs 类页面上找到),如果存在大量未决连接,将导致堆栈溢出,这可以在任何实现其处理模型的系统上被利用。
解决此问题的其他想法是创建一个调用处理程序方法的循环,条件是 Socket.AcceptAsync 返回的值等于 false,如果value 表示操作正在异步完成(true)。但是,这个解决方案也会导致堆栈溢出漏洞,因为与传递给Socket.AcceptAsync 的SocketAsyncEventArgs 关联的回调在方法的末尾有一个对Socket.AcceptAsync 的调用,它也有一个立即执行的循环可用的、同步接受的连接。
如您所见,这是一个非常可靠的问题,我还没有找到一个不涉及System.Threading.ThreadPool 和创建大量其他方法和调度处理的好解决方案。据我所知,与Socket.AcceptAsync 相关的异步套接字模型需要的不仅仅是 MSDN 上的示例中演示的内容。
有没有人有一个干净有效的解决方案来处理从 Socket.AcceptAsync 同步接受的立即挂起的连接,而无需创建单独的线程来处理连接并且不使用递归?
【问题讨论】:
-
是的,MSDN 上的示例并不总是最好的(或最佳实践,就此而言)。你能澄清你的问题吗?您是否正在寻找一种使用不会导致 StackOverflowExceptoin 的异步套接字的方法?
-
没错;我正在寻找一种非递归方式来处理立即挂起的连接。
标签: c# sockets asynchronous