#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
работы.