我正在尝试停止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: 不允许发送或接收数据的请求,因为套接字未连接(当使用sendto调用在数据报套接字上发送时)没有提供地址 在System.Net.Sockets.Socket.Shutdown(SocketShutdown how)
编辑2010年5月14日
经过进一步调查,可以抛出异常并正确关闭套接字。
有时,即使应用程序退出 netstat ,也会显示套接字仍处于LISTENING状态。
我无法创建明确的复制场景,它发生在看似随机的时间。
客户端套接字可以独立清理。
你有什么建议可以帮助我让这个插座死掉吗?
答案 0 :(得分:3)
如果发生异常,请使用finally块调用Close():
try
{
myServer.Server.Shutdown(SocketShutdown.Both);
}
catch (Exception ex)
{
LogException(ex);
}
finally
{
myServer.Server.Close(0);
myServer.Stop();
}
我也很好奇是否因为你没有提到的某些规范而需要操作底层套接字? TCPListener / Client旨在帮助您避免在大多数情况下担心这些通信机制。
另外,如果这没有帮助,SocketException返回什么ErrorCode? p>
答案 1 :(得分:1)
尝试在关闭前调用停止...
答案 2 :(得分:0)
应用退出后,套接字无法处于侦听状态。然而,它可能处于等待状态;这是完全正常的。
答案 3 :(得分:0)
有类似的问题: - TcpListener等待客户端连接 - 关闭处理
有同样的问题(win7,win2k)。
对我来说有效的解决方案(?到目前为止)是在处理侦听器时关闭与客户端的每个连接。似乎如果程序存在,而VS仍然存在活动连接,则在程序关闭后,这些连接可能会保留。