【问题标题】:ASIO - Detect dead connectionASIO - 检测死连接
【发布时间】:2015-05-04 17:46:51
【问题描述】:

我正在尝试使用 Boost ASIO 库在 C++ 中创建一个异步服务器,它遵循他们的网页、ioservice 和 worker(会话)提供的标准模型 我正在使用这样的东西:

asio::async_read(socket,buffer(data,datalen),[=]( error , len ){
     if(error || len==0) disconnect(); else processRequest(data,len);
})

首先,它工作得很好,当用户打开和关闭连接时 - 操作系统会完成这项工作。

但是当用户强行断开与互联网的连接时,问题就出现了,尽管用户已经离开,但套接字仍处于“ESTABLISHED”状态,是的,当互联网不再可用时,操作系统将如何处理发送 TCP 关闭数据包?

电话互联网网络也有问题,用户旅行,将区域从 HSDPA 切换到无互联网,最后是 GPRS,旧的 HSDPA 套接字仍然“已建立”,尽管用户已经不使用它。

如何检测这样的死连接?

【问题讨论】:

  • TCP/IP协议定义了一个keep-alive机制,可以检测传输层的丢失。 See here也请。

标签: c++ networking tcp boost-asio


【解决方案1】:
  • 当客户端应用程序关闭套接字时,您的读取处理程序将立即被调用
  • 当客户端应用程序崩溃但客户端操作系统仍然在线时,您的读取处理程序将在客户端操作系统超时(一分钟左右)后调用
  • 拔下客户端计算机电缆时,根本没有任何通知。您可以在应用层实现保活机制,也可以使用 TCP 内置的保活机制。我建议您自己做,因为您有更多控制权(例如重新连接会话)。原则上,您会执行async_write,这将导致您的写入处理程序被调用并出现错误。

【讨论】:

  • 我真的可以通过 TCP 向客户端发送 0 字节的数据,这样客户端就不会在 recv 中注意到它,并且我会进行探测检查连接是否存在?我不想通过处理一些 ping 数据包来打扰客户端实现。
  • 您不能发送 0 字节。为了在应用层保持活动状态,客户端和服务器之间必须有一个商定的协议。客户端应该和服务器有同样的问题。如果客户端对保持活动不感兴趣,您可以简单地在服务器端实现超时并踢客户端。
猜你喜欢
  • 1970-01-01
  • 2017-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-24
  • 1970-01-01
  • 1970-01-01
  • 2014-06-28
相关资源
最近更新 更多