170 похожих чатов

Добрый вечер. Есть вопрос на счет функции websocket::stream::async_read в boost::beast.

В случае если я вызываю его в функции void и функция завершает выходит то что сервер перестает слушать сокет?

10 ответов

25 просмотров

Нет

The end.- Автор вопроса
Maus Grau
Нет

выходит при получении сообщения функция обратного вызова будет вызвана?

The end.- Автор вопроса
Maus Grau
Если все написано правильно, то да

что подразумевается под "правильно"?

The end.
что подразумевается под "правильно"?

Все аргументы переданы правильно, буфер переживает функцию, вызван run и т. п.

The end.- Автор вопроса
Maus Grau
Все аргументы переданы правильно, буфер переживает...

Моя проблема в том что функция 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)); }); }

The end.- Автор вопроса
Maus Grau
Все аргументы переданы правильно, буфер переживает...

Моя проблема в том что функция 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)); }); }

The end.
Моя проблема в том что функция handle_connection()...

Оберните код в теги: 3 символа ` до и после кода (в случае одиночной конструкции достаточно 1 ` с обеих сторон). Спасибо!

The end.
Моя проблема в том что функция handle_connection()...

1. Как вы поняли что оно не работает? 2. У вас мув сокета в do_accept может произойти раньше вызова async_accept, так как порядок вычисления аргументов не определен. 3. ws не доживает до вызова асинхронной функции

The end.- Автор вопроса
Maus Grau
1. Как вы поняли что оно не работает? 2. У вас мув...

Спасибо огромное за помощь. Проблема исправлена.

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта