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

本文关键字:套接字 状态 连接 计算机 | 更新日期: 2023-09-27 18:34:44

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

我想当我在客户端应用程序上调用Socket.Close时,TCP FIN数据包会发送到服务器,对吧?但似乎没有。

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

附言我在关闭之前已经调用了关闭,但问题仍然存在。

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

没有基于通知的方法可以知道客户端是否断开连接。这就是TCP/IP通信的本质。了解客户端是否已连接的常用方法是将数据写入客户端连接。如果收到错误,则可以猜测客户端已断开连接。您可以通过查找特定异常来简化启发式

虽然我没有 C# 套接字编程的实践经验,但似乎Socket.Close()不会发送挂起的数据,并且暗示不会发送 FIN 数据包。(在我看来,这有点误导,因为Close语义似乎与调用Dispose(true)如果可能的话尝试刷新的Stream.Close()不同。如果我错了,请纠正我。

MSDN 文档指出:

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

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