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