首页 文章

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

提问于
浏览
11

当我的程序退出时,我正在尝试停止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 回答

  • 0

    如果发生异常,请使用finally块调用Close():

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

    我也很好奇是否因为你没有提到的某些规范而需要操作底层套接字? TCPListener / Client旨在帮助您避免在大多数情况下担心这些通信机制 .

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

  • 0

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

  • 3

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

  • 1

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

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

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

相关问题