Boost Deadline Timer运行时中止调用问题

时间:2019-03-04 21:27:41

标签: c++ tcp timer boost-asio

我有两个对象A和B。A在下面使用B,这是一个tcp客户端对象。对象B是在对象A的构造函数中的单独线程中创建的。在B的构造函数中,我将Boost Asio用于套接字和截止时间计时器。我使用异步调用进行套接字连接并等待计时器。这是对象B的构造函数的代码:

B::B(const boost::asio::ip::address& ipaddr, 
                                     std::uint16_t port) : io_service_(),
                                                           socket_(io_service_), 
                                                           endpoint_(ipaddr, port),
                                                           connected_(false) {
    boost::asio::deadline_timer dt(io_service_);
    socket_.async_connect(endpoint_, [this, &dt](const boost::system::error_code& ec) {
        if (ec) {
            std::cout << ec.message() << std::endl;
        }
        else {
            dt.cancel();
            std::cout << "Connected before timer expired" << std::endl;
            connected_ = true;
            socket_.set_option(boost::asio::socket_base::keep_alive(true));
        }
    });
    dt.expires_from_now(boost::posix_time::seconds(3));
    dt.async_wait([this](const boost::system::error_code& ec) {
        if (ec) {
            std::cout << ec.message() << std::endl;
        }
        else {
            std::cout << "Timer expired before connection" << std::endl;
            io_service_.stop();
        }
    });
    io_service_.run();
}

当tcp客户端要连接的计算机处于ON状态时,它可以工作。当机器处于关闭状态时,预期截止期限计时器将在3秒后到期,并且不会设置连接标志。我在执行过程中收到中止调用。我确定这与截止时间计时器有关,但无法确切确定具体内容。

有人看到这里有什么问题或有其他建议吗? Boost Deadline Timer我缺少什么吗?

0 个答案:

没有答案