私は単純なboost.beast websocketサーバーを作成して、接続を受け付けるポインタをそこに保存し、誰かが接続しているすべてのソケットにメッセージを送信しているときに作成します。boost.beastを使ってwebsocketサーバーを作成する
私は例async_server boost.beastからコードを撮影した: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
。
と私は
for(auto player : server::players_connections){
player->send_message("already accepted");
}
とサーバー::接続の最後に
を追加しましたon_read(ERROR_CODE EC)方法::無効サーバー::接続の終わりに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)));
}
: :on_accept:
:第2のソケットは、私はこのエラーを持って接続し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
私は何をしないのですか?
例が改善されました。確認してください: http://www.boost.org/doc/libs/develop/libs/beast/doc/html/beast/examples.html –