質問内容
c++超初心者です。
websocketppというboostベースのライブラリを用いてサーバー側のコンソールアプリを作ろうとしており、双方向からメッセージを送受信したいと考えています。
公式のサンプルコード等を参考にした結果、クライアントから受信したテキストデータをコンソール上に表示することはできるのですが、サーバー側から自発的にテキストをクライアントに送信する(コンソールに文字列をうちこんで送信)ための方法がわかりません。
少し調査した結果、入力を受け付けるような割り込み処理を追加する、もしくは複数スレッドにわける方法がある等が考えられるのですが、いずれにしても実装方法が全くわからず困っています。
以下、現状のソースコードになります。
どなたか解決方法を教えていただけますと幸いです、よろしくお願いいたします。
ソースコード
c++
1#include <websocketpp/config/asio_no_tls.hpp> 2#include <websocketpp/server.hpp> 3#include <iostream> 4 5typedef websocketpp::server<websocketpp::config::asio> server; 6 7using websocketpp::lib::placeholders::_1; 8using websocketpp::lib::placeholders::_2; 9using websocketpp::lib::bind; 10 11 12class utility_server { 13 14private: 15 server m_endpoint; 16 websocketpp::connection_hdl m_hdl; 17 std::string message; 18 19public: 20 utility_server() { 21 // Set logging settings 22 m_endpoint.set_error_channels(websocketpp::log::elevel::all); 23 m_endpoint.set_access_channels(websocketpp::log::alevel::all); 24 // Initialize Asio 25 m_endpoint.init_asio(); 26 27 // Register our handler 28 m_endpoint.set_open_handler(bind(&utility_server::on_open, this,::_1)); 29 m_endpoint.set_close_handler(bind(&utility_server::on_close, this, ::_1)); 30 m_endpoint.set_message_handler(bind( 31 &utility_server::on_message, this, 32 ::_1, ::_2 33 )); 34 35 //割り込み処理? 36 //m_endpoint.set_interrupt_handler(bind(&utility_server::send_message, this, ::_1)); 37 } 38 39 //Handlers 40 void on_open(websocketpp::connection_hdl hdl) { 41 std::cout << "Connected" << std::endl; 42 } 43 44 void on_close(websocketpp::connection_hdl hdl) { 45 std::cout << "Disconnected" << std::endl; 46 } 47 48 49 void on_message(websocketpp::connection_hdl hdl, server::message_ptr msg) { 50 std::cout << msg->get_payload()<<std::endl; 51 52 } 53 54 55 //送信用メソッド 56 void send_message(websocketpp::connection_hdl) { 57 std::cin >> message; 58 try { 59 m_endpoint.send(m_hdl, message, websocketpp::frame::opcode::text); 60 61 } 62 catch (const websocketpp::lib::error_code & e) { 63 std::cout << e.message() << std::endl; 64 } 65 66 } 67 68 69 void run() { 70 // Listen on port 8080 71 m_endpoint.listen(8080); 72 73 // Queues a connection accept operation 74 m_endpoint.start_accept(); 75 76 // Start the Asio io_service run loop 77 m_endpoint.run(); 78 79 80 } 81 82 83}; 84 85int main() 86{ 87 utility_server s; 88 s.run(); 89 90 return 0; 91} 92
実行環境
・windows10(64bit)
・Visual Studio Pro 2019
あなたの回答
tips
プレビュー