我试图在程序退出时停止TCP监听器。我不在乎套接字上或任何事件的客户端套接字上当前处于事件状态的任何数据。

套接字清理代码本质上是:

try
{
    myServer.Server.Shutdown(SocketShutdown.Both)
}
catch (Exception ex)
{
     LogException(ex)
}
myServer.Server.Close(0)
myServer.Stop()

myServer是一个TCPListener

在某些情况下,关机会引发异常

System.Net.Sockets.SocketException:
不允许发送或接收数据的请求,因为未连接套接字,并且(当使用sendto调用在数据报套接字上发送时)未提供地址
在System.Net.Sockets.Socket.Shutdown(SocketShutdown方式)

编辑2010年5月14日

经过进一步调查,可以引发异常,并且可以正确关闭套接字。

有时,即使在应用程序退出后, netstat 仍显示套接字仍处于LISTENING状态。

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

客户端套接字是独立清理的。

您有什么建议可以帮助我使这个 socket 消失吗?

最佳答案

在发生异常的情况下,使用finally块来调用Close():

try
{
    myServer.Server.Shutdown(SocketShutdown.Both);
}
catch (Exception ex)
{
    LogException(ex);
}
finally
{
    myServer.Server.Close(0);
    myServer.Stop();
}

我也很好奇是否由于您未提及的某些规范而需要对底层套接字进行操作? TCPListener/Client的设计使您在大多数情况下都不必担心那些通信机制。

另外,如果这没有帮助,则SocketException返回什么ErrorCode?

关于c# - 程序退出后,TcpListener套接字仍处于事件状态,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2822268/

10-11 22:17
查看更多