2017-06-15 1 views
1

Comment effectuer une écriture et une lecture asynchrones à l'aide des WebSockets de la bibliothèque Beast? J'ai essayé d'adapter l'exemple écriture/lecture synchrone fourni dans la documentation Beast here, mais le code ci-dessous ne se comporte pas comme prévu.Comment effectuer une lecture/écriture asynchrone avec les Websockets Beast?

Je me attendais à la sortie suivante:

*launch application* 
Written data ... 
Received data : Hello world! 
*Ctrl-C* 
Closing application ... 

je me suis ceci:

*launch application* 
*Ctrl-C* 
Closing application ... 

code:

#include <beast/core/to_string.hpp> 
#include <beast/websocket.hpp> 
#include <boost/asio.hpp> 
#include <iostream> 
#include <string> 

/// Block until SIGINT or SIGTERM is received. 
void sig_wait(beast::websocket::stream<boost::asio::ip::tcp::socket&>& ws) 
{ 
    boost::asio::io_service ios; 
    boost::asio::signal_set signals(ios, SIGINT, SIGTERM); 
    signals.async_wait(
     [&](boost::system::error_code const&, int) 
     { 
      ws.close(beast::websocket::close_code::normal); 
      std::cout << "Closing application ..." << std::endl; 
     }); 
    ios.run(); 
} 

int main(int argc, char *argv[]) 
{ 
    // Normal boost::asio setup 
    std::string const host = "echo.websocket.org"; 
    boost::asio::io_service ios; 
    boost::asio::ip::tcp::resolver r{ios}; 
    boost::asio::ip::tcp::socket sock{ios}; 
    boost::asio::ip::tcp::resolver::iterator iter (r.resolve(boost::asio::ip::tcp::resolver::query{host, "80"})); 
    boost::asio::connect(sock,iter); 

    // WebSocket connect and send message 
    beast::websocket::stream<boost::asio::ip::tcp::socket&> ws{sock}; 
    ws.handshake(host, "/"); 
    ws.async_write(boost::asio::buffer(std::string("Hello world!")), 
        [&](beast::error_code const&) 
        { 
         std::cout << "Written data ..." << '\n'; 
        } 
    ); 

    // Register handle for async_read 
    beast::streambuf sb; 
    beast::websocket::opcode op; 
    ws.async_read(op,sb, 
        [&](beast::error_code const&) 
        { 
         std::cout << "Received data : " << to_string(sb.data()) << '\n'; 
        } 
    ); 

    sig_wait(ws); 
} 

Side note: Je suis assez nouveau à la bibliothèque Boost en général , donc j'ai peut-être mal compris certaines des bases ...

Répondre

3

Vous devez appeler io_service :: run(), c'est l'appel de blocage qui va animer le io_service.

+0

Ce n'est pas une réponse . C'est une question! – celavek

+0

Je m'attendais à ce que le flux websocket gère le service io derrière la scène. Ai-je tort de le supposer? – Eskilade

+0

Oui, vous devez appeler run(). C'est l'appel bloquant contenant la boucle io qui fait la magie .. –