【发布时间】:2011-02-18 19:39:35
【问题描述】:
我正在尝试在程序退出时停止 TCP 侦听器。我不关心套接字或任何活动客户端套接字上当前处于活动状态的任何数据。
socket 清理代码本质上是:
try
{
myServer.Server.Shutdown(SocketShutdown.Both)
}
catch (Exception ex)
{
LogException(ex)
}
myServer.Server.Close(0)
myServer.Stop()
myServer 是一个 TCPListener
在某些情况下,Shutdown 会抛出异常
System.Net.Sockets.SocketException: 不允许发送或接收数据的请求,因为未连接套接字并且(当使用 sendto 调用在数据报套接字上发送时)未提供地址 在 System.Net.Sockets.Socket.Shutdown(SocketShutdown 如何)
编辑 2010 年 5 月 14 日
进一步排查,可以抛出异常,正确关闭socket。
有时,即使在应用程序退出后 netstat 显示套接字仍处于 LISTENING 状态。
我无法创建明确的复制场景,它发生在看似随机的时间。
客户端套接字被独立清理。
你有什么建议可以帮我把这个插座弄死吗?
【问题讨论】:
-
在我看来,C# 监听套接字的行为很奇怪。或者也许它只是窗户。我有一个类似(尚未解决)的问题,也许那里的答案会对你有所帮助,虽然我们的问题有点不同:stackoverflow.com/questions/2821520/…
-
问题非常相似。 Socket 保持在 LISTENING 状态,不会变为 TIME_WAIT。重新启动应用程序会导致“每个套接字地址只能使用一次......”错误。
-
好吧,我只是在那儿愚蠢,现在我得到了解决方案。问题是,它在重新启动程序后对我有用,只是没有重新启动它。你在你的程序中使用线程吗?
-
是的,应用程序是多线程的。线程被设置为 IsBackground = true,它应该在主 GUI 线程结束时结束。看起来线程应该关闭并且服务器停止。确实如此 - 大多数时候,但不是在异常发生和处理时。
-
您是否尝试过在异常捕获上设置 myServer = null (使其无法访问并支持 GC)?我想你以后需要重新实例化它......