Автономный asio async_connect не запускает связанный обработчик - PullRequest
0 голосов
/ 16 апреля 2019

Я следовал документации и примерам , предоставленным реализацией 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(&ssl_writer::handle_connect, this, _1));
}

//...

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

1 Ответ

1 голос
/ 16 апреля 2019

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

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

...