Автономный asio async_connect не запускает связанный обработчик

#c #ssl #asio

#c #ssl #asio

Вопрос:

Я следовал документации и примерам, предоставленным реализацией boost asio, но после подключения моего клиента к серверу мне не повезло. Независимо от успеха или неудачи, обработчик никогда не вызывается. Я проверил, что сервер получает и принимает соединение от клиента, но на стороне клиентов ничего не происходит, что указывало бы на успех.

 void ssl_writer::main_thread() {
    using namespace std::placeholders;
    using namespace asio::ip;

    tcp::resolver resolver(io_context);
    tcp::resolver::query query("192.168.170.115", "8591");
    tcp::resolver::iterator endpointer_iterator = resolver.resolve(query);

    io_context.run();

    std::cout << "connecting...";
    asio::async_connect(socket.lowest_layer(), endpointer_iterator, std::bind(amp;ssl_writer::handle_connect, this, _1));
}

//...

void ssl_writer::handle_connect(const std::error_codeamp; error) {
    if (!error) {
        std::cout << "connected!";
    }
    else {
        std::cout << "failed!";
    }
}
 

Комментарии:

1. В неправильном месте, которое вы вызываете io_context.run() , это должно быть после async_connect . Внутри io_context.run() вызываются завершенные обработчики.

2. Я не могу поверить, что пропустил это. Если хотите, включите это в ответ, и я приму его.

Ответ №1:

io_context::run() обрабатывает обработчики до тех пор, пока не останется обработчиков для обработки. Поскольку вы еще не запускали никаких асинхронных вызовов, обработчиков нет, и run они возвращаются немедленно.

В этом простом примере вам нужно вызвать io_context::run() after async_connect , в более сложных программах вы обычно создаете рабочий поток для вызова io_context::run() и создаете экземпляр boost::asio::executor_work_guard , чтобы предотвратить завершение io_context работы.