В случае если я вызываю его в функции void и функция завершает выходит то что сервер перестает слушать сокет?
Нет
выходит при получении сообщения функция обратного вызова будет вызвана?
Если все написано правильно, то да
что подразумевается под "правильно"?
Все аргументы переданы правильно, буфер переживает функцию, вызван run и т. п.
Моя проблема в том что функция handle_connection() не ожидает новых сообщений, не могли бы Вы подсказать примеру проблему? Спасибо. void acceptor_func(asio::io_context& ioc) { tcp::acceptor acceptor(ioc, tcp::endpoint(tcp::v4(), 8090)); tcp::socket socket(ioc); do_accept(acceptor, std::move(socket)); BOOST_LOG_TRIVIAL(trace) << "\ndo_accept() started\n"; ioc.run(); } void handle_connection(websocket::stream<tcp::socket> ws) { BOOST_LOG_TRIVIAL(trace) << "Handling new WebSocket connection"; ws.async_accept([&ws](boost::system::error_code ec) { if (!ec) { // Reading the first message which should contain JWT. boost::beast::flat_buffer buffer; BOOST_LOG_TRIVIAL(trace) << "The first message from the socket received."; ws.async_read(buffer, [&ws, &buffer](boost::system::error_code ec, std::size_t) { if (!ec) { auto data = boost::beast::buffers_to_string(buffer.data()); BOOST_LOG_TRIVIAL(trace) << "Received: " << data; int botid = jwtdecode(data, ""); if (botid != 1) { BOOST_LOG_TRIVIAL(trace) << "ClientConnection class created."; ClientConnection tConnection(std::move(ws)); verified_connections.emplace(botid, std::move(tConnection)); } else { BOOST_LOG_TRIVIAL(trace) << "Connection closed due to policy error."; ws.close(websocket::close_code::policy_error); } } }); } }); } void do_accept(tcp::acceptor& acceptor, tcp::socket socket) { BOOST_LOG_TRIVIAL(trace) << "Waiting for new WebSocket connection..."; acceptor.async_accept(socket, [&acceptor, socket = std::move(socket)](boost::system::error_code ec) mutable { if (!ec) { websocket::stream<tcp::socket> ws(std::move(socket)); BOOST_LOG_TRIVIAL(trace) << "Calling handle_connection()..."; handle_connection(std::move(ws)); } do_accept(acceptor, std::move(socket)); }); }
Моя проблема в том что функция handle_connection() не ожидает новых сообщений, не могли бы Вы подсказать примеру проблему? Спасибо. void acceptor_func(asio::io_context& ioc) { tcp::acceptor acceptor(ioc, tcp::endpoint(tcp::v4(), 8090)); tcp::socket socket(ioc); do_accept(acceptor, std::move(socket)); BOOST_LOG_TRIVIAL(trace) << "\ndo_accept() started\n"; ioc.run(); } void handle_connection(websocket::stream<tcp::socket> ws) { BOOST_LOG_TRIVIAL(trace) << "Handling new WebSocket connection"; ws.async_accept([&ws](boost::system::error_code ec) { if (!ec) { // Reading the first message which should contain JWT. boost::beast::flat_buffer buffer; BOOST_LOG_TRIVIAL(trace) << "The first message from the socket received."; ws.async_read(buffer, [&ws, &buffer](boost::system::error_code ec, std::size_t) { if (!ec) { auto data = boost::beast::buffers_to_string(buffer.data()); BOOST_LOG_TRIVIAL(trace) << "Received: " << data; int botid = jwtdecode(data, ""); if (botid != 1) { BOOST_LOG_TRIVIAL(trace) << "ClientConnection class created."; ClientConnection tConnection(std::move(ws)); verified_connections.emplace(botid, std::move(tConnection)); } else { BOOST_LOG_TRIVIAL(trace) << "Connection closed due to policy error."; ws.close(websocket::close_code::policy_error); } } }); } }); } void do_accept(tcp::acceptor& acceptor, tcp::socket socket) { BOOST_LOG_TRIVIAL(trace) << "Waiting for new WebSocket connection..."; acceptor.async_accept(socket, [&acceptor, socket = std::move(socket)](boost::system::error_code ec) mutable { if (!ec) { websocket::stream<tcp::socket> ws(std::move(socket)); BOOST_LOG_TRIVIAL(trace) << "Calling handle_connection()..."; handle_connection(std::move(ws)); } do_accept(acceptor, std::move(socket)); }); }
Оберните код в теги: 3 символа ` до и после кода (в случае одиночной конструкции достаточно 1 ` с обеих сторон). Спасибо!
1. Как вы поняли что оно не работает? 2. У вас мув сокета в do_accept может произойти раньше вызова async_accept, так как порядок вычисления аргументов не определен. 3. ws не доживает до вызова асинхронной функции
Спасибо огромное за помощь. Проблема исправлена.
Обсуждают сегодня