处理套接字断开.Boost / Winsock
Handling socket disconnection. Boost / Winsock
正如标题所示,我使用过winsock &提高套接字。我有一个难以置信的困难检测断开。
首先,我知道可以通过以下命令发现断开连接:
- recv()/async_read()返回socket错误或0。
- send()/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.
这是我必须忍受的吗?我有点迷路了,因为我已经尽我所能去检测断线了……然而,他们仍然是一个问题。
TCP不能保证仅接收的一方能够检测到连接丢失。您在TCP之上实现的协议应该在其设计中考虑到这一点。如果没有,协议就被打破了,你应该大声地向设计它的人投诉。
如果你自己设计一个协议,不要跳过记录协议的步骤。这应该始终包括它是否支持应用程序级消息、它们是如何形成帧的、谁在何时传输、如何检测断开连接、任何超时等等。在没有实际设计的情况下实现的"即兴"协议基本上注定要失败,即使它碰巧工作,也永远无法维护,因为它实际上不可能确定它应该如何工作。
一旦有了协议规范,至少可以通过以下简单步骤来确定问题所在:
-
服务器是否遵循规范?如果不是,停下来。
-
客户是否遵循规范?如果不是,停下来。
-
停止。
没有说明,这些问题是无法回答的。很多痛苦都是这样造成的。
- 理解boost::asio-async_read在无需读取内容时的行为
- boost::进程间消息队列引发错误
- 如何运行位于boost/libs/python/example/tutorial目录中的hello.cpp和Jamfil
- cmake如何在fedora工作站中找到boost静态库包
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- Boost Graph Library,修复节点大小
- 什么是"#include <boost/functional/hash.hpp> "?
- 基于boost的程序的静态链接——zlib问题
- C++:如何在CLion IDE中安装Boost
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 如何在boost beast http请求中设置http头
- Boost Spirit,获取迭代器内部语义动作
- boost::asio::steady_timer()与sleep()我应该使用哪一个
- boost::asio如何生成多个协同程序,然后加入它们
- 当我尝试使用 sstream 和分面将 Boost Time_duration转换为字符串时,我没有得到所需的格式
- Visual Studio(或任何其他工具)能否将地址解释为调用堆栈(boost上下文)的开头
- Boost::asio-winsock和winsock 2的兼容性问题
- 处理套接字断开.Boost / Winsock
- 已经包含了boost asio和WinSock.h
- WinSock.h已经包含了Boost Windows Qt