Я разрабатываю настольный чат с boost asio и beast (для поддержки браузера).
Я использую эту архитектуру:
Но при сборкеУ меня проблема: bad_weak_ptr
, я не знаю, что не так: s Здесь ссылка на источник https://onlinegdb.com/BkFhDGHe4
Update1 : я убрал функцию run () в конструктори переместите его в функцию handle_accept, класс tcp_server.например:
void tcp_server::handle_accept(const boost::system::error_code ec, websocket_session_ptr new_websocket)
{
if (!ec)
{
// Happens when the timer closes the socket
if(ec == boost::asio::error::operation_aborted)
return;
new_websocket->run(); //Here
chatwebsocketsessionpointer session = chat_websocket_session::create(room, new_websocket);
room->join(session);
wait_for_connection();
}
}
Я вижу, что chat_webocket_session удален, но все еще есть проблема с bad_weak_ptr
Обновление 2: Я обнаружил, в чем проблема.Если я никогда не вызываю функцию do_read (), ошибки не возникает, и я могу подключиться к серверу с помощью ws. Если я вызываю ее в wait_for_data из класса chat_websoket_session, у меня возникает проблема.Поэтому я должен найти способ вызова do_read ()
Обновление 3: Если я сделаю websocket_session_ptr new_websocket(new websocket_session(std::move(socket)));
acceptor.async_accept(
socket,
boost::bind(
&tcp_server::websocket_accept,
this,
boost::asio::placeholders::error,
new_websocket
));
, сделав ссылку на: Пример увеличения зверя websocket , Сначала я принимаю сокет, а после того, как принимаю веб-сокет с m_ws.async_accept()
, но теперь у меня есть Bad file descriptor
, что означает, что сокет не открыт.
PS: я обновляю ide URL (онлайн-отладчик GDB)