2017-08-12 2 views
0

Je souhaite créer un serveur webwebweb boost.beast simple qui accepte les connexions et qui enregistre le pointeur et quand quelqu'un se connecte envoie un message à chaque socket connectée.Création d'un serveur websocket avec boost.beast

J'ai pris le code de boost.beast async_server exemple: https://github.com/vinniefalco/Beast/blob/master/example/websocket-server-async/websocket_server_async.cpp

et a ajouté:

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

et

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))); 
     } 

A la fin de la méthode serveur vide :: connexion :: on_read (error_code ec) J'ai ajouté

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

et à la fin du serveur :: connexion: : on_accept:

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

Quand seconde douille connecte i ai cette erreur:

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 

code modifié complet du serveur: http://morse.swirski.name/pastes/vrv552rf2yc7fyyflxhejukjdpr4vxe

Qu'est-ce que je manque?

Répondre

0

Il semble que le bug était parce que j'appelais

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

deux fois de suite cela a été une cause du problème. Je ne suis pas sûr pourquoi. Je soupçonne que la méthode do_read appelée l'une après l'autre était à l'origine du problème. J'apprécierais toutes les suggestions.

+2

Les exemples ont été améliorés, vérifiez-le: http://www.boost.org/doc/libs/develop/libs/beast/doc/html/beast/examples.html –