#include "acceptor.hpp" #include #include #include #include using namespace boost::asio; using namespace boost::asio::ip; void accept_loop(tcp::acceptor& acceptor, std::function f); void accept_connection(tcp::acceptor& acceptor, std::shared_ptr socket, boost::system::error_code ec, std::function f) { if(!bool(ec)) { f(std::move(*socket)); accept_loop(acceptor, f); } else { std::stringstream ss; ss << ec; throw std::runtime_error(ss.str()); } } void accept_loop(tcp::acceptor& acceptor, std::function f) { std::shared_ptr new_socket = std::make_shared(acceptor.get_io_service()); acceptor.async_accept(*new_socket, boost::bind(accept_connection, boost::ref(acceptor), new_socket, boost::asio::placeholders::error, f)); } Acceptor::Acceptor(boost::asio::io_service &io_service, boost::asio::ip::address address, uint16_t port) : acceptor(io_service) , endpoint(address, port) {} void Acceptor::bind_v6_and_v4_any(std::function accept_handler) { acceptor.open(endpoint.protocol()); v6_only option(false); acceptor.set_option(option); acceptor.bind(endpoint); acceptor.listen(); accept_loop(acceptor, accept_handler); } void Acceptor::setup_listen_socket(std::function accept_handler) { acceptor.open(endpoint.protocol()); acceptor.bind(endpoint); acceptor.listen(); accept_loop(acceptor, accept_handler); }