使用boost.beast创建websocket服务器

问题描述 投票:0回答:2

我想创建简单的boost.beast websocket服务器,它接受连接保存指向它的指针,当有人将发送消息连接到每个连接的套接字时。

我从boost.beast async_server示例中获取了代码:https://github.com/vinniefalco/Beast/blob/master/example/websocket-server-async/websocket_server_async.cpp

并补充说:

static std::vector<std::shared_ptr<connection>> server::players_connections;

void server::connection::send_message(std::string msg){
            boost::beast::ostream(buffer_) << msg;
            ws_.binary(ws_.got_binary());
            ws_.async_write(buffer_.data(),
                            strand_.wrap(std::bind(
                                    &connection::on_write,
                                    shared_from_this(),
                                    std::placeholders::_1)));
        }

在我添加的void server :: connection :: on_read(error_code ec)方法结束时

 for(auto  player : server::players_connections){
                player->send_message("already accepted");
            }

并在server :: connection :: on_accept的末尾:

players_connections.push_back(std::make_shared<connection>(*this, ep_, std::move(sock_)));
        players_connections.back()->run();

当第二个套接字连接时,我有这个错误:

websocket-server-async: /usr/local/boost_1_64_0/boost/beast/websocket/detail/pausation.hpp:210: void boost::beast::websocket::detail::pausation::emplace(F&&) [with F = boost::beast::websocket::stream<boost::asio::basic_stream_socket<boost::asio::ip::tcp> >::write_some_op<boost::beast::buffer_prefix_view<boost::beast::consuming_buffers<boost::beast::basic_multi_buffer<std::allocator<char> >::const_buffers_type> >, boost::beast::websocket::stream<boost::asio::basic_stream_socket<boost::asio::ip::tcp> >::write_op<boost::beast::basic_multi_buffer<std::allocator<char> >::const_buffers_type, boost::asio::detail::wrapped_handler<boost::asio::io_service::strand, std::_Bind<std::_Mem_fn<void (server::connection::*)(boost::system::error_code)>(std::shared_ptr<server::connection>, std::_Placeholder<1>)>, boost::asio::detail::is_continuation_if_running> > >]: Assertion `! base_' failed.
Aborted

服务器的完整修改代码:http://morse.swirski.name/pastes/vrv552rf2yc7fyyflxhejukjdpr4vxe

我错过了什么?

c++ sockets boost websocket boost-asio
2个回答
0
投票

看起来这个错误是因为我在打电话

ws_.async_write(buffer_.data(),
                            strand_.wrap(std::bind(
                                    &connection::on_write,
                                    shared_from_this(),
                                    std::placeholders::_1)));

这连续两次引起了这个问题。我不知道为什么。我怀疑方法do_read一个接一个地调用导致问题。我会赞美任何建议。


0
投票

有一个非阻塞的基于Boost :: Beast的WebSocket库,可以简化WebSockets集成。

它被称为WebSockets-Callback.CPP available on GitHub

© www.soinside.com 2019 - 2024. All rights reserved.