#include "crow.h" #include #include int main() { crow::SimpleApp app; std::mutex mtx; std::unordered_set users; CROW_WEBSOCKET_ROUTE(app, "/ws") .onopen([&](crow::websocket::connection& conn) { CROW_LOG_INFO << "new websocket connection from " << conn.get_remote_ip(); std::lock_guard _(mtx); users.insert(&conn); }) .onclose([&](crow::websocket::connection& conn, const std::string& reason) { CROW_LOG_INFO << "websocket connection closed: " << reason; std::lock_guard _(mtx); users.erase(&conn); }) .onmessage([&](crow::websocket::connection& /*conn*/, const std::string& data, bool is_binary) { std::lock_guard _(mtx); for (auto u : users) if (is_binary) u->send_binary(data); else u->send_text(data); }); CROW_ROUTE(app, "/") ([] { char name[256]; gethostname(name, 256); crow::mustache::context x; x["servername"] = name; auto page = crow::mustache::load("ws.html"); return page.render(x); }); app.port(40080) .multithreaded() .run(); }