c++ - 确保使用 async_read 读取数据

标签 c++ boost boost-asio

我目前正在带宽非常低的环境中测试我的网络应用程序。我目前有代码试图通过确保我仍在接收信息来确保连接良好。

传统上,我通过在我的 ReadHandler 函数中记录时间戳来完成此操作,这样每次它被调用时我都知道我已经在套接字上接收到数据。对于非常低的带宽,这还不够,因为我的 ReadHandler 没有被足够频繁地调用。

我一直在考虑编写自己的完成条件函数(现在我正在使用 tranfer_at_least(1)),认为它会被更频繁地调用,我可以在那里记录我的时间戳,但我想知道是否有' 其他一些更标准的方法来解决这个问题。

最佳答案

我们在生产中遇到了类似的问题:我们的一些连接可能会闲置几天,但我们必须尽快检测远程是否挂掉。

我们通过启用 TCP_KEEPALIVE 选项解决了这个问题:

boost::asio::socket_base::keep_alive option(true);
mSocketTCP.set_option(option);

它必须伴随着新的启动脚本,该脚本将合理的值写入 /proc/sys/net/ipv4/tcp_keepalive_*,默认情况下超时时间很长(在 LInux 上)

关于c++ - 确保使用 async_read 读取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7354022/

相关文章:

C++ 字符指针数组 - 无法访问元素

c++ - CPP boost 访客多目标

c++ - 在 C++ 中实现高效的多线程文件 I/O

c++ - Google::protobuf + boost::asio 失败

c++ - 链接 boost 库时引发 "Error while loading shared libraries",但我无法使用 root 访问权限来修复它

c++ - boost::asio 文件发送

c++ - g++ 不会链接到/usr/lib/中的库

c++ - 测量可执行文件的数据和指令缓存的大小

c++ - OpenCV 与 QT 的集成

c++ - 如何将 boost local_date_time 转换为 time_t