Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 处理插座断开。Boost/Winsock_C++_Sockets_Networking_Boost_Disconnection - Fatal编程技术网

C++ 处理插座断开。Boost/Winsock

C++ 处理插座断开。Boost/Winsock,c++,sockets,networking,boost,disconnection,C++,Sockets,Networking,Boost,Disconnection,正如标题所示,我使用过winsock和boost套接字。我在检测断开连接时遇到了难以置信的困难 首先,我知道可以通过以下方式发现断开: recv()/async_read()返回套接字错误或0 发送()/异步写入() 客户端是否手动关闭,是否被中断/程序关闭-无论什么 以下是问题场景: 我使用closesocket()关闭连接。客户端检测到断开连接-一切正常。 我关闭程序-客户端有50/50的机会无法检测到断开连接。由于某些原因,我的重叠IO WSARecv()不能保证检测。 我扼杀了这个过程。

正如标题所示,我使用过winsock和boost套接字。我在检测断开连接时遇到了难以置信的困难

首先,我知道可以通过以下方式发现断开:

  • recv()/async_read()返回套接字错误或0
  • 发送()/异步写入()
  • 客户端是否手动关闭,是否被中断/程序关闭-无论什么
  • 以下是问题场景:

    我使用closesocket()关闭连接。客户端检测到断开连接-一切正常。

    我关闭程序-客户端有50/50的机会无法检测到断开连接。由于某些原因,我的重叠IO WSARecv()不能保证检测。

    我扼杀了这个过程。被发现的几率增加到80%<代码>但对于剩下的20%的人来说,这就是困扰我的原因。我实现了一个keep-alive ping机制,将数据发送到服务器。即使我终止了程序-服务器仍然异步写入()连接-即使它未被检测到或已死亡。


    这是我必须忍受的吗?我有点迷路了,因为我尽我所能检测断开的连接。。。然而,它们仍然是一个问题。

    TCP不能保证只有接收端才能检测到连接丢失。在TCP之上实现的协议应该在其设计中考虑到这一点。如果没有,协议就被破坏了,你应该向设计它的人大声抱怨

    如果您自己设计协议,请不要跳过记录协议的步骤。这应该始终包括它是否支持应用程序级消息、它们的帧设置方式、何时由谁传输、如何检测断开连接、任何超时等。在没有实际设计的情况下实现的“即兴”协议基本上是注定要失败的,而且,即使它碰巧工作,也永远无法维护,因为根本不可能确定它应该如何工作

    一旦制定了协议规范,至少可以通过以下简单步骤确定问题所在:

  • 服务器是否遵循规范?如果没有,请停止。服务器坏了

  • 客户是否遵循规范?如果没有,请停止。客户机坏了

  • 停下来。规格有问题


  • 如果没有规范,这些问题是无法回答的。TCP不能保证只有接收端才能检测到连接丢失。在TCP之上实现的协议应该在其设计中考虑到这一点。如果没有,协议就被破坏了,你应该向设计它的人大声抱怨

    如果您自己设计协议,请不要跳过记录协议的步骤。这应该始终包括它是否支持应用程序级消息、它们的帧设置方式、何时由谁传输、如何检测断开连接、任何超时等。在没有实际设计的情况下实现的“即兴”协议基本上是注定要失败的,而且,即使它碰巧工作,也永远无法维护,因为根本不可能确定它应该如何工作

    一旦制定了协议规范,至少可以通过以下简单步骤确定问题所在:

  • 服务器是否遵循规范?如果没有,请停止。服务器坏了

  • 客户是否遵循规范?如果没有,请停止。客户机坏了

  • 停下来。规格有问题


  • 如果没有规范,这些问题是无法回答的。这样做会带来很多痛苦。

    您在TCP之上实现了什么协议?它有协议规范吗?当一个连接被异常终止/丢失时,操作系统无法知道它已经消失了(很长)一段时间,因此在这段时间内它不会报告错误,并缓冲等待对等方接受数据的传出数据。这就是套接字级keepalives和协议级ping发挥作用的地方。如果keepalive/ping超时且未能及时响应,则只需关闭套接字,而不管其实际状态如何。您在TCP之上实现了什么协议?它有协议规范吗?当一个连接被异常终止/丢失时,操作系统无法知道它已经消失了(很长)一段时间,因此在这段时间内它不会报告错误,并缓冲等待对等方接受数据的传出数据。这就是套接字级keepalives和协议级ping发挥作用的地方。如果keepalive/ping超时且未能及时响应,则不管其实际状态如何,只要关闭套接字即可。