代码之家  ›  专栏  ›  技术社区  ›  Javid

远程计算机关闭后,套接字仍保持连接

  •  1
  • Javid  · 技术社区  · 9 年前

    我已经搜索过了,但没有解决我的问题。 我正在本地主机上模拟TCP网络。服务器在端口上侦听,客户端连接到服务器。问题是,当我按客户端关闭套接字时 Socket.Connected 在服务器中保持为真。我需要知道客户端何时断开连接。

    我想当我打电话的时候 Socket.Close 在客户端应用程序上,TCP FIN 数据包被发送到服务器,对吗?但似乎没有。

    你能给我一个解决方案吗?

    P.S.我已经在关门前叫停了,但问题仍然存在。

    2 回复  |  直到 9 年前
        1
  •  2
  •   Vikhram    9 年前

    没有基于通知的方法可以知道客户端是否断开连接。这就是tcp/ip通信的本质。了解客户端是否连接的通常方法是将数据写入客户端连接。如果出现错误,您可以猜测客户端已断开连接。您可以通过查找特定的异常来简化试探法

        2
  •  1
  •   Peter - Reinstate Monica    9 年前

    虽然我对C#中的套接字编程没有实际经验,但似乎 Socket.Close() 不发送待定数据,并且暗示不发送FIN分组。(我认为这有点误导,因为 Close 语义似乎与 Stream.Close() 它会调用 Dispose(true) 如果可能的话,它尝试冲洗。如果我错了,请纠正我。)

    这个 MSDN documentation 状态:

    对于面向连接的协议,建议您调用 在调用Close方法之前关闭。这确保了所有数据 在关闭之前在连接的套接字上发送和接收。

    如果需要在不首先调用Shutdown的情况下调用Close,可以 确保排队等待传出传输的数据将由 将DontLingerSocket选项设置为false并指定非零 超时间隔。关闭将阻塞,直到发送此数据或 直到指定的超时到期。如果将DontLinger设置为false 并指定零超时间隔,Close将释放连接 并自动丢弃传出的排队数据。