【问题标题】:boost asio: How to monitor that a tcp connection is aliveboost asio:如何监视 tcp 连接是否处于活动状态
【发布时间】:2012-04-05 12:09:04
【问题描述】:

我有一个使用 asio 的异步 TCP/IP 客户端。当连接丢失时,我的 async_read 句柄函数收到一个错误。所以我被告知连接丢失。

现在,我正在重构一些实现同步 TCP/IP 客户端的遗留代码,其中抽象接口强制执行此序列:同步写入,然后是同步读取。 使用 asio 执行此操作相当容易,但我想异步知道连接是否丢失。

有没有比以下更优雅的方式:

选项 A: 添加一个线程来检查套接字是否仍处于活动状态(通过尝试读取...但我如何确定读取不会从我的同步读取中窃取数据?请参阅Boost asio ip tcp iostream Error Detection

选项 B: 改用 async_read 并模拟同步读取

【问题讨论】:

  • 我认为答案是否定的。不过,也许有一些特定于平台的解决方案。
  • 我认为 TCP 协议无法检测到连接失败,除非它未能在特定时间范围内收到对已发送数据包的确认。
  • 我已经实现了选项 B。但是,有两件事我不明白 1. 未检测到断开连接 2. 如果我拔掉了服务器的以太网电缆(即打印机) ,我仍然可以向它发送数据并且它没有返回错误。只有第二次,它会抛出一个错误

标签: c++ boost boost-asio


【解决方案1】:

我想同步操作会像异步操作一样失败。但是,当同步失败时,它可能会更具破坏性,因为超时可能会很长,并且当其他一切都必须等待它时会更加明显。

您可能希望考虑在您的套接字上启用 TCP 保持活动,并可能降低 TCP 保持活动间隔,以便更快地检测到丢失的连接。

【讨论】:

  • 值得一提; TCP-keepalive 有一些限制,最值得注意的是(据我所知)没有可移植的方法来设置 keepalive 的超时。此外,默认超时非常大;例如,在 Linux 上,默认的 keepalive 间隔是 2 小时,并且必须有 9 次探测失败,然后才会认为连接已死。
  • 本质是,在大多数情况下,您必须自己在应用程序代码中处理连接超时,如果可能的话,向协议添加“心跳”检查,并尝试为超时。 (“这个操作真的需要 5 秒吗?”等等。)
猜你喜欢
  • 1970-01-01
  • 2019-09-01
  • 1970-01-01
  • 2010-10-16
  • 2014-03-24
  • 1970-01-01
  • 2014-01-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多