我已经搜索过,但没有解决我的问题。
我在我的localhost上模拟TCP网络。服务器侦听端口,客户端连接到服务器。问题是当我通过客户端关闭套接字时,Socket.Connected
在服务器中仍然存在。我需要知道客户端何时断开连接。
我想当我在客户端应用程序上调用Socket.Close
时,TCP FIN
数据包会被发送到服务器,对吧?但似乎没有。
你能给我一个解决方案吗?
P.S。我在关闭之前已经调用了关机,但问题仍然存在。
答案 0 :(得分:2)
没有基于通知的方式来了解客户端是否已断开连接。这是tcp / ip通信的本质。了解客户端是否连接的常用方法是将数据写入客户端连接。如果出现错误,您可以猜测客户端已断开连接。您可以通过查找特定异常来简化启发式方法
答案 1 :(得分:1)
虽然我没有使用C#中的套接字编程的实际经验,但Socket.Close()
似乎没有发送待处理的数据,并且暗示并不发送FIN数据包。 (在我看来,这有点误导,因为Close
语义似乎与调用Stream.Close()
Dispose(true)
的{{1}}不同,如果可能的话,它会尝试刷新。如果我错了,请纠正我。)
对于面向连接的协议,建议您拨打电话 在调用Close方法之前关闭。这确保了所有数据 在连接的套接字关闭之前发送和接收。
如果你需要在没有先打电话给Shutdown的情况下拨打关闭,你可以 确保排队等待传出传输的数据将被发送 将DontLingerSocket选项设置为false并指定非零 超时间隔。然后关闭将阻止,直到发送此数据或 直到指定的超时到期。如果将DontLinger设置为false 并指定零超时间隔,关闭释放连接 并自动丢弃传出的排队数据。