当我的程序退出时,我正在尝试停止TCP侦听器 . 我不关心套接字或任何活动客户端套接字上当前活动的任何数据 .
套接字清理代码基本上是:
try
{
myServer.Server.Shutdown(SocketShutdown.Both)
}
catch (Exception ex)
{
LogException(ex)
}
myServer.Server.Close(0)
myServer.Stop()
myServer是一个TCPListener
在某些情况下,Shutdown会抛出异常
System.Net.Sockets.SocketException: A request to send or receive data was disallowed because the socket is not connected and (when sending on a datagram socket using a sendto call) no address was supplied at System.Net.Sockets.Socket.Shutdown(SocketShutdown how)
Edit 2010-May-14
经过进一步调查,可以抛出异常并正确关闭套接字 .
有时,即使在应用程序退出后 netstat 显示套接字仍处于LISTENING状态 .
我无法创建明确的再现场景,它发生在看似随机的时间 .
客户端套接字是独立清理的 .
你有什么建议帮我把这个插座呀?
4 回答
如果发生异常,请使用finally块调用Close():
我也很好奇是否因为你没有提到的某些规范而需要操作底层套接字? TCPListener / Client旨在帮助您避免在大多数情况下担心这些通信机制 .
此外,如果这没有帮助,SocketException返回什么ErrorCode?
尝试在关闭前调用停止...
应用程序退出后,套接字不能处于侦听状态 . 然而,它可能处于等待状态;这是完全正常的 .
有一个类似的问题: - TcpListener等待客户端连接 - 关闭处理
有同样的问题(win7,win2k) .
对我来说有效的解决方案(?到目前为止)是在处理侦听器时关闭与客户端的每个连接 . 似乎如果程序存在,但仍然存在活动连接VS客户端,那么在程序关闭后这些连接可能仍然存在 .