Повышение срока выполнения таймера проблемы прерывания вызова во время выполнения - PullRequest
0 голосов
/ 05 марта 2019

У меня есть два объекта 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?

...