C++ 处理插座断开。Boost/Winsock
正如标题所示,我使用过winsock和boost套接字。我在检测断开连接时遇到了难以置信的困难 首先,我知道可以通过以下方式发现断开:C++ 处理插座断开。Boost/Winsock,c++,sockets,networking,boost,disconnection,C++,Sockets,Networking,Boost,Disconnection,正如标题所示,我使用过winsock和boost套接字。我在检测断开连接时遇到了难以置信的困难 首先,我知道可以通过以下方式发现断开: recv()/async_read()返回套接字错误或0 发送()/异步写入() 客户端是否手动关闭,是否被中断/程序关闭-无论什么 以下是问题场景: 我使用closesocket()关闭连接。客户端检测到断开连接-一切正常。 我关闭程序-客户端有50/50的机会无法检测到断开连接。由于某些原因,我的重叠IO WSARecv()不能保证检测。 我扼杀了这个过程。
这是我必须忍受的吗?我有点迷路了,因为我尽我所能检测断开的连接。。。然而,它们仍然是一个问题。TCP不能保证只有接收端才能检测到连接丢失。在TCP之上实现的协议应该在其设计中考虑到这一点。如果没有,协议就被破坏了,你应该向设计它的人大声抱怨 如果您自己设计协议,请不要跳过记录协议的步骤。这应该始终包括它是否支持应用程序级消息、它们的帧设置方式、何时由谁传输、如何检测断开连接、任何超时等。在没有实际设计的情况下实现的“即兴”协议基本上是注定要失败的,而且,即使它碰巧工作,也永远无法维护,因为根本不可能确定它应该如何工作 一旦制定了协议规范,至少可以通过以下简单步骤确定问题所在:
如果没有规范,这些问题是无法回答的。TCP不能保证只有接收端才能检测到连接丢失。在TCP之上实现的协议应该在其设计中考虑到这一点。如果没有,协议就被破坏了,你应该向设计它的人大声抱怨 如果您自己设计协议,请不要跳过记录协议的步骤。这应该始终包括它是否支持应用程序级消息、它们的帧设置方式、何时由谁传输、如何检测断开连接、任何超时等。在没有实际设计的情况下实现的“即兴”协议基本上是注定要失败的,而且,即使它碰巧工作,也永远无法维护,因为根本不可能确定它应该如何工作 一旦制定了协议规范,至少可以通过以下简单步骤确定问题所在:
如果没有规范,这些问题是无法回答的。这样做会带来很多痛苦。您在TCP之上实现了什么协议?它有协议规范吗?当一个连接被异常终止/丢失时,操作系统无法知道它已经消失了(很长)一段时间,因此在这段时间内它不会报告错误,并缓冲等待对等方接受数据的传出数据。这就是套接字级keepalives和协议级ping发挥作用的地方。如果keepalive/ping超时且未能及时响应,则只需关闭套接字,而不管其实际状态如何。您在TCP之上实现了什么协议?它有协议规范吗?当一个连接被异常终止/丢失时,操作系统无法知道它已经消失了(很长)一段时间,因此在这段时间内它不会报告错误,并缓冲等待对等方接受数据的传出数据。这就是套接字级keepalives和协议级ping发挥作用的地方。如果keepalive/ping超时且未能及时响应,则不管其实际状态如何,只要关闭套接字即可。