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

传统上,我通过在 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/

10-12 17:11