程序退出后,TcpListener套接字仍处于活动状态

时间:2010-05-12 19:49:17

标签: c# sockets

我正在尝试停止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状态。

我无法创建明确的复制场景,它发生在看似随机的时间。

客户端套接字可以独立清理。

你有什么建议可以帮助我让这个插座死掉吗?

4 个答案:

答案 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?

答案 1 :(得分:1)

尝试在关闭前调用停止...

答案 2 :(得分:0)

应用退出后,套接字无法处于侦听状态。然而,它可能处于等待状态;这是完全正常的。

答案 3 :(得分:0)

有类似的问题: - TcpListener等待客户端连接 - 关闭处理

有同样的问题(win7,win2k)。

对我来说有效的解决方案(?到目前为止)是在处理侦听器时关闭与客户端的每个连接。似乎如果程序存在,而VS仍然存在活动连接,则在程序关闭后,这些连接可能会保留。