| 16 | namespace server { |
| 17 | |
| 18 | server::server(const std::string& address, const std::string& port, |
| 19 | const std::string& doc_root) |
| 20 | : io_context_(1), |
| 21 | signals_(io_context_), |
| 22 | acceptor_(io_context_), |
| 23 | connection_manager_(), |
| 24 | request_handler_(doc_root) |
| 25 | { |
| 26 | // Register to handle the signals that indicate when the server should exit. |
| 27 | // It is safe to register for the same signal multiple times in a program, |
| 28 | // provided all registration for the specified signal is made through Asio. |
| 29 | signals_.add(SIGINT); |
| 30 | signals_.add(SIGTERM); |
| 31 | #if defined(SIGQUIT) |
| 32 | signals_.add(SIGQUIT); |
| 33 | #endif // defined(SIGQUIT) |
| 34 | |
| 35 | do_await_stop(); |
| 36 | |
| 37 | // Open the acceptor with the option to reuse the address (i.e. SO_REUSEADDR). |
| 38 | boost::asio::ip::tcp::resolver resolver(io_context_); |
| 39 | boost::asio::ip::tcp::endpoint endpoint = |
| 40 | *resolver.resolve(address, port).begin(); |
| 41 | acceptor_.open(endpoint.protocol()); |
| 42 | acceptor_.set_option(boost::asio::ip::tcp::acceptor::reuse_address(true)); |
| 43 | acceptor_.bind(endpoint); |
| 44 | acceptor_.listen(); |
| 45 | |
| 46 | do_accept(); |
| 47 | } |
| 48 | |
| 49 | void server::run() |
| 50 | { |