Advertisement
Guest User

Untitled

a guest
Aug 5th, 2016
443
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.31 KB | None | 0 0
  1. #include <set>
  2. #include <websocketpp/config/asio_no_tls.hpp>
  3. #include <websocketpp/server.hpp>
  4.  
  5. typedef websocketpp::server<websocketpp::config::asio> server;
  6.  
  7. using websocketpp::connection_hdl;
  8. using websocketpp::lib::placeholders::_1;
  9. using websocketpp::lib::placeholders::_2;
  10. using websocketpp::lib::bind;
  11.  
  12. struct connection_data {
  13.     int sessionid;
  14.     bool hello;
  15. };
  16.  
  17. class broadcast_server {
  18. public:
  19.     uint8_t log_level = 0;
  20.  
  21.     broadcast_server() : m_next_sessionid(1) {
  22.         m_server.init_asio();
  23.  
  24.         m_server.set_open_handler(bind(&broadcast_server::on_open, this, ::_1));
  25.         m_server.set_close_handler(bind(&broadcast_server::on_close, this, ::_1));
  26.         m_server.set_message_handler(bind(&broadcast_server::on_message, this, ::_1, ::_2));
  27.     }
  28.  
  29.     void on_open(connection_hdl hdl) {
  30.         connection_data data;
  31.  
  32.         data.sessionid = m_next_sessionid++;
  33.         data.hello = false;
  34.  
  35.         m_connections[hdl] = data;
  36.     }
  37.  
  38.     void on_close(connection_hdl hdl) {
  39.         m_connections.erase(hdl);
  40.     }
  41.  
  42.     void on_message(connection_hdl hdl, server::message_ptr msg) {
  43.         connection_data& data = get_data_from_hdl(hdl);
  44.  
  45.         if (msg->get_opcode() == websocketpp::frame::opcode::binary) {
  46.             data.hello = true;
  47.             m_server.send(hdl, msg);
  48.         } else {
  49.             this->close(hdl, websocketpp::close::status::normal);
  50.         }
  51.  
  52.         /*
  53.         for (auto it : m_connections) {
  54.             // m_server.send(it, msg);
  55.         }
  56.         */
  57.     }
  58.  
  59.     void close(connection_hdl hdl, websocketpp::close::status::value code) {
  60.         websocketpp::lib::error_code ec;
  61.  
  62.         m_server.close(hdl, code, "", ec);
  63.  
  64.         if (ec && log_level > 0) {
  65.             std::cout << "> Error initiating close: " << ec.message() << std::endl;
  66.         }
  67.     }
  68.  
  69.     void log(uint8_t level) {
  70.         log_level = level;
  71.         m_server.clear_access_channels(websocketpp::log::alevel::all);
  72.  
  73.         switch (level) {
  74.             case 1:
  75.                 m_server.set_access_channels(websocketpp::log::alevel::connect | websocketpp::log::alevel::disconnect);
  76.                 break;
  77.             case 2:
  78.                 m_server.set_access_channels(websocketpp::log::alevel::connect | websocketpp::log::alevel::disconnect);
  79.                 m_server.set_access_channels(websocketpp::log::alevel::frame_header | websocketpp::log::alevel::frame_payload);
  80.                 break;
  81.         }
  82.     }
  83.  
  84.     void run(uint16_t port) {
  85.         if (log_level == 0) m_server.clear_access_channels(websocketpp::log::alevel::all);
  86.         m_server.listen(port);
  87.         m_server.start_accept();
  88.         m_server.run();
  89.     }
  90.  
  91.     connection_data& get_data_from_hdl(connection_hdl hdl) {
  92.         auto it = m_connections.find(hdl);
  93.  
  94.         if (it == m_connections.end()) {
  95.             throw std::invalid_argument("No data avaliable for session");
  96.         }
  97.  
  98.         return it->second;
  99.     }
  100. private:
  101.     typedef std::map<connection_hdl, connection_data, std::owner_less<connection_hdl>> con_list;
  102.  
  103.     int m_next_sessionid;
  104.     server m_server;
  105.     con_list m_connections;
  106. };
  107.  
  108. int main() {
  109.     broadcast_server server;
  110.     uint16_t port = 1500;
  111.  
  112.     std::cout << "Server is running on port " << port << "." << std::endl;
  113.     server.run(port);
  114. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement