diff --git a/examples/associative_storage/associative_storage.cpp b/examples/associative_storage/associative_storage.cpp new file mode 100644 index 0000000000..c5a0194a1c --- /dev/null +++ b/examples/associative_storage/associative_storage.cpp @@ -0,0 +1,88 @@ +#include +#include +#include +#include +#include + +typedef websocketpp::server server; + +using websocketpp::connection_hdl; +using websocketpp::lib::placeholders::_1; +using websocketpp::lib::placeholders::_2; +using websocketpp::lib::bind; + +struct connection_data { + int sessionid; + std::string name; +}; + +class print_server { +public: + print_server() : m_next_sessionid(1) { + m_server.init_asio(); + + m_server.set_open_handler(bind(&print_server::on_open,this,::_1)); + m_server.set_close_handler(bind(&print_server::on_close,this,::_1)); + m_server.set_message_handler(bind(&print_server::on_message,this,::_1,::_2)); + } + + void on_open(connection_hdl hdl) { + connection_data data; + + data.sessionid = m_next_sessionid++; + data.name = ""; + + m_connections[hdl] = data; + } + + void on_close(connection_hdl hdl) { + connection_data& data = get_data_from_hdl(hdl); + + std::cout << "Closing connection " << data.name + << " with sessionid " << data.sessionid << std::endl; + + m_connections.erase(hdl); + } + + void on_message(connection_hdl hdl, server::message_ptr msg) { + connection_data& data = get_data_from_hdl(hdl); + + if (data.name == "") { + data.name = msg->get_payload(); + std::cout << "Setting name of connection with sessionid " + << data.sessionid << " to " << data.name << std::endl; + } else { + std::cout << "Got a message from connection " << data.name + << " with sessionid " << data.sessionid << std::endl; + } + } + + connection_data& get_data_from_hdl(connection_hdl hdl) { + auto it = m_connections.find(hdl); + + if (it == m_connections.end()) { + // this connection is not in the list. This really shouldn't happen + // and probably means something else is wrong. + throw std::invalid_argument("No data avaliable for session"); + } + + return it->second; + } + + void run(uint16_t port) { + m_server.listen(port); + m_server.start_accept(); + m_server.run(); + } +private: + typedef std::map> con_list; + + int m_next_sessionid; + server m_server; + con_list m_connections; +}; + +int main() { + print_server server; + server.run(9002); +} \ No newline at end of file diff --git a/examples/enriched_storage/enriched_storage.cpp b/examples/enriched_storage/enriched_storage.cpp new file mode 100644 index 0000000000..fbedc8ee29 --- /dev/null +++ b/examples/enriched_storage/enriched_storage.cpp @@ -0,0 +1,87 @@ +#include +#include +#include + +struct connection_data { + int sessionid; + std::string name; +}; + +struct custom_config : public websocketpp::config::asio { + // pull default settings from our core config + typedef websocketpp::config::asio core; + + typedef core::concurrency_type concurrency_type; + typedef core::request_type request_type; + typedef core::response_type response_type; + typedef core::message_type message_type; + typedef core::con_msg_manager_type con_msg_manager_type; + typedef core::endpoint_msg_manager_type endpoint_msg_manager_type; + typedef core::alog_type alog_type; + typedef core::elog_type elog_type; + typedef core::rng_type rng_type; + typedef core::transport_type transport_type; + typedef core::endpoint_base endpoint_base; + + // Set a custom connection_base class + typedef connection_data connection_base; +}; + +typedef websocketpp::server server; +typedef server::connection_ptr connection_ptr; + +using websocketpp::connection_hdl; +using websocketpp::lib::placeholders::_1; +using websocketpp::lib::placeholders::_2; +using websocketpp::lib::bind; + +class print_server { +public: + print_server() : m_next_sessionid(1) { + m_server.init_asio(); + + m_server.set_open_handler(bind(&print_server::on_open,this,::_1)); + m_server.set_close_handler(bind(&print_server::on_close,this,::_1)); + m_server.set_message_handler(bind(&print_server::on_message,this,::_1,::_2)); + } + + void on_open(connection_hdl hdl) { + connection_ptr con = m_server.get_con_from_hdl(hdl); + + con->sessionid = m_next_sessionid++; + } + + void on_close(connection_hdl hdl) { + connection_ptr con = m_server.get_con_from_hdl(hdl); + + std::cout << "Closing connection " << con->name + << " with sessionid " << con->sessionid << std::endl; + } + + void on_message(connection_hdl hdl, server::message_ptr msg) { + connection_ptr con = m_server.get_con_from_hdl(hdl); + + if (con->name == "") { + con->name = msg->get_payload(); + std::cout << "Setting name of connection with sessionid " + << con->sessionid << " to " << con->name << std::endl; + } else { + std::cout << "Got a message from connection " << con->name + << " with sessionid " << con->sessionid << std::endl; + } + } + + void run(uint16_t port) { + m_server.listen(port); + m_server.start_accept(); + m_server.run(); + } +private: + int m_next_sessionid; + server m_server; +}; + +int main() { + print_server server; + server.run(9002); +} \ No newline at end of file