我创建了一个简单的基于tcp的“echo协议”,并注意到当客户端强行关闭连接(发送重置)时,我在服务器上遇到句柄泄漏。
我捕获ConnectionReset并以与套接字关闭时相同的方式处理套接字(socket.Shutdown和socket.close)。有没有人遇到过这样的问题? 当我正在执行socket.Read时抛出ConnectionReset异常,如果重要的话。
感谢。
编辑:Microsoft的DebugDiag工具建议这些是由MSCORLIB创建的事件处理程序。不用说我不直接创建它们(但它们是由.net库创建的)
答案 0 :(得分:1)
Socket.Close()
应该(根据我的intellisense)释放套接字句柄。
首先确保确实调用Socket.Close()
。然后检查其他地方是否有手柄泄漏,您是否正在使用任何需要处理的物品?比如打开FileStream
s?
答案 1 :(得分:-1)
我认为你做得对:
Socket.Close应该释放与套接字关联的所有托管和非托管资源。
但是你也尝试设置
socket = null;
也许(之后)使用
GC.Collect();
手动触发垃圾收集器,此后是否仍然存在泄漏?
另一个想法: 你如何监控手柄泄漏?操作系统可能会在内存中保持关闭的TCP连接很长时间(分钟),这是正常行为。