#include "accept.hpp" #include #include using namespace boost::asio::ip; using namespace boost::asio; 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, placeholders::error, f)); } void accept_connection(tcp::acceptor& acceptor, std::shared_ptr ctx, std::shared_ptr> socket, boost::system::error_code ec, std::function&&)> f) { if(!bool(ec)) { f(std::move(*socket)); accept_loop(acceptor, ctx, f); } else { std::stringstream ss; ss << ec; throw std::runtime_error(ss.str()); } } void accept_loop(tcp::acceptor& acceptor, std::shared_ptr ctx, std::function&& socket)> f) { std::shared_ptr> new_socket = std::make_shared>(acceptor.get_io_service(), *ctx); acceptor.async_accept(new_socket->lowest_layer(), boost::bind(accept_connection, boost::ref(acceptor), ctx, new_socket, placeholders::error, f)); }