// // Copyright (c) 2016-2019 Vinnie Falco (vinnie dot falco at gmail dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // // Official repository: https://github.com/boostorg/beast // //------------------------------------------------------------------------------ // // Example: WebSocket server, asynchronous // //------------------------------------------------------------------------------ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include std::optional parse_config(const char* filename) { try { std::cout << "TRYING" << std::endl; std::ifstream in(filename, std::ios::in | std::ios::binary); if (in) { std::cout << "GOT IN" << std::endl; std::stringstream contents; contents << in.rdbuf(); in.close(); std::cout << contents.str() << std::endl; boost::json::value value = boost::json::parse(contents.str()); return value.as_object(); } } catch (std::exception const& e) { std::cout << e.what() << std::endl; } return {}; } //------------------------------------------------------------------------------ // void initLogLevel(int level) { switch (level) { case 0: boost::log::core::get()->set_filter( boost::log::trivial::severity >= boost::log::trivial::trace); break; case 1: boost::log::core::get()->set_filter( boost::log::trivial::severity >= boost::log::trivial::debug); break; case 2: boost::log::core::get()->set_filter( boost::log::trivial::severity >= boost::log::trivial::info); break; case 3: boost::log::core::get()->set_filter( boost::log::trivial::severity >= boost::log::trivial::warning); break; case 4: boost::log::core::get()->set_filter( boost::log::trivial::severity >= boost::log::trivial::error); break; case 5: boost::log::core::get()->set_filter( boost::log::trivial::severity >= boost::log::trivial::fatal); break; default: boost::log::core::get()->set_filter( boost::log::trivial::severity >= boost::log::trivial::info); } } int main(int argc, char* argv[]) { // Check command line arguments. if (argc != 5 and argc != 6) { std::cerr << "Usage: websocket-server-async
" " \n" << "Example:\n" << " websocket-server-async 0.0.0.0 8080 1 config.json 2\n"; return EXIT_FAILURE; } auto const address = boost::asio::ip::make_address(argv[1]); auto const port = static_cast(std::atoi(argv[2])); auto const threads = std::max(1, std::atoi(argv[3])); auto const config = parse_config(argv[4]); if (argc > 5) { initLogLevel(std::atoi(argv[5])); } else { initLogLevel(2); } if (!config) { std::cerr << "couldnt parse config. Exiting..." << std::endl; return EXIT_FAILURE; } // The io_context is required for all I/O boost::asio::io_context ioc{threads}; ReportingETL etl{config.value(), ioc}; // Create and launch a listening port std::make_shared( ioc, boost::asio::ip::tcp::endpoint{address, port}, etl) ->run(); // Run the I/O service on the requested number of threads std::vector v; v.reserve(threads - 1); for (auto i = threads - 1; i > 0; --i) v.emplace_back([&ioc] { ioc.run(); }); std::cout << "created ETL" << std::endl; etl.run(); std::cout << "running ETL" << std::endl; ioc.run(); return EXIT_SUCCESS; }