提升 asio async_read_some 超时

Posted

技术标签:

【中文标题】提升 asio async_read_some 超时【英文标题】:boost asio async_read_some timeout 【发布时间】:2017-02-27 14:11:15 【问题描述】:

我使用此代码使用 async_read_some 和超时

        readdata=0;
        port_->async_read_some(boost::asio::buffer(vector),
                boost::bind(readCallback));


        //init async timer
        boost::asio::deadline_timer timer(io);
        timer.async_wait(boost::bind(timeoutHandler));
        timer.expires_from_now(boost::posix_time::seconds(5));

        io.reset();
        do 
            io.run_one();
        
        while (readdata==0);

这是我的回调

void readCallback()

    std::cout << "READ CALLBACK: "<<x<<std::endl;
    readdata=1;
    return;

void timeoutHandler()

   std::cout << "TIMEOUT CALLBACK: "<<x<<std::endl;
   readdata=1;

我的问题是 timeoutHandler 是立即执行的,而不是在 5 秒后执行

【问题讨论】:

自从我使用 asio 已经有一段时间了,但是当您删除 io.reset() 时会发生什么?这可能会导致async_wait 重置 就像@SteveVanOpstal 所说,您应该删除io.reset()。您正在向异步事件处理程序 (io_service) 添加任务,然后在运行将执行您添加的事件的服务之前立即重置它(您使用 run_one() 执行此操作)。我建议您阅读并了解有关 io_service 及其工作原理的更多信息。 谢谢,我试过了,但结果一样,timeoutHandler() 被立即调用 【参考方案1】:

简单的错误。在调用async_wait 之前,您应该先进行expires_from_now

#include <iostream>
#include <asio.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>

int main() 
  asio::io_service io_s;
  asio::deadline_timer timer(io_s);
  timer.expires_from_now(boost::posix_time::seconds(5));
  timer.async_wait([](auto err_c)  std::cout << "After 5 seconds" << std::endl;  );

  io_s.reset();

  io_s.run();

  return 0;

【讨论】:

以上是关于提升 asio async_read_some 超时的主要内容,如果未能解决你的问题,请参考以下文章

提升asio断网处理

Boost ASIO,未调用 async_read_some 回调

asio::tcp::socket 的 async_read_some 和 async_receive 有啥区别?

传递给 boost::asio::async_read_some 的回调从未在 boost::asio::read_some 返回数据的使用中调用

boost asio async_read_some 只读数据

为啥 boost asio async_read_some 在特定情况下不调用回调?