正如标题所暗示的,我使用过winsock 和boost 插座。我在检测断开连接时遇到了难以置信的困难。
首先,我知道可以通过以下方式发现断开连接:
- recv() / async_read() 返回套接字错误或 0。
- 发送() / async_write() ... ... ...
- 客户端是否手动关闭,是否被中断/程序关闭 - 无论如何。
所以这里是问题场景:
我用 closesocket() 关闭了我的连接。客户端检测到断开连接 - 一切正常。
我关闭程序 - 客户端无法检测到断开连接的可能性为 50/50。由于某种原因,我的重叠 IO WSARecv() 不能保证检测到。
我杀死了这个过程。检测的机会增加到 80%。But for the rest of the 20% - here's what's bothering me. I implemented a keep-alive ping mechanism which sends data to the server. Even if I killed the program - the server is still async_writing() to the connection - even though it's not detected or dead.
这是我必须忍受的吗?我有点迷失了,因为我尽我所能检测断线……但它们仍然是个问题。