当远程主机强行关闭插座时处理泄漏? (。净)

时间:2010-02-18 09:49:29

标签: .net sockets memory-leaks

我创建了一个简单的基于tcp的“echo协议”,并注意到当客户端强行关闭连接(发送重置)时,我在服务器上遇到句柄泄漏。

我捕获ConnectionReset并以与套接字关闭时相同的方式处理套接字(socket.Shutdown和socket.close)。有没有人遇到过这样的问题? 当我正在执行socket.Read时抛出ConnectionReset异常,如果重要的话。

感谢。

编辑:Microsoft的DebugDiag工具建议这些是由MSCORLIB创建的事件处理程序。不用说我不直接创建它们(但它们是由.net库创建的)

2 个答案:

答案 0 :(得分:1)

不幸的是,Socket.Recieve和Socket.Write是唯一可以检测到另一端强行而非正确地关闭它的套接字的地方。

Socket.Close()应该(根据我的intellisense)释放套接字句柄。

首先确保确实调用Socket.Close()。然后检查其他地方是否有手柄泄漏,您是否正在使用任何需要处理的物品?比如打开FileStream s?

答案 1 :(得分:-1)

我认为你做得对:

Socket.Close应该释放与套接字关联的所有托管和非托管资源。

但是你也尝试设置

socket = null;

也许(之后)使用

GC.Collect();

手动触发垃圾收集器,此后是否仍然存在泄漏?

另一个想法: 你如何监控手柄泄漏?操作系统可能会在内存中保持关闭的TCP连接很长时间(分钟),这是正常行为。