//----------------------------------------------------------------------------- // ___ __ _ _ // / _ \__ _ _ __ ___ ___ / /(_)_ __ | | __ // / /_)/ _` | '__/ __|/ _ \/ / | | '_ \| |/ / // / ___/ (_| | | \__ \ __/ /__| | | | | < // \/ \__,_|_| |___/\___\____/_|_| |_|_|\_\ . // //----------------------------------------------------------------------------- // Author: Kurt Sassenrath // Module: Server // // Server implementation. Currently, a monolithic server which: // * Communicates with users via TCP (msgpack). // * Runs the websocket server for overlays to read. // // Copyright (c) 2023 Kurt Sassenrath. // // License TBD. //----------------------------------------------------------------------------- #include #include #include #include #include #include namespace net = boost::asio; using namespace parselink; namespace { logging::logger logger("server"); } class monolithic_server : public server { public: monolithic_server(std::string_view address, std::uint16_t user_port, std::uint16_t websocket_port); std::error_code run() noexcept override; private: net::io_context io_context_; net::ip::address addr_; net::ip::tcp::acceptor user_acceptor_; }; monolithic_server::monolithic_server(std::string_view address, std::uint16_t user_port, std::uint16_t websocket_port) : io_context_{1} , addr_(net::ip::address::from_string(std::string{address})) , user_acceptor_{io_context_, {addr_, user_port}} { logger.debug("Creating monolithic_server with" "\n\taddress {},\n\tuser_port {},\n\twebsocket_port {}", address, user_port, websocket_port); } std::error_code monolithic_server::run() noexcept { logger.info("Starting server."); net::signal_set signals(io_context_, SIGINT, SIGTERM); signals.async_wait([&](auto, auto){ logger.info("Received signal... Shutting down."); io_context_.stop(); }); io_context_.run(); return {}; } std::unique_ptr parselink::make_server(std::string_view address, std::uint16_t user_port, std::uint16_t websocket_port) { using impl = monolithic_server; return std::make_unique(address, user_port, websocket_port); }