diff options
Diffstat (limited to 'network-handler/acceptor.cpp')
| -rw-r--r-- | network-handler/acceptor.cpp | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/network-handler/acceptor.cpp b/network-handler/acceptor.cpp new file mode 100644 index 0000000..34b5f0e --- /dev/null +++ b/network-handler/acceptor.cpp @@ -0,0 +1,59 @@ +#include "acceptor.hpp" + +#include <boost/asio/ip/tcp.hpp> +#include <boost/asio/ip/v6_only.hpp> +#include <boost/asio/placeholders.hpp> +#include <boost/bind.hpp> + + +using namespace boost::asio; +using namespace boost::asio::ip; + +void accept_loop(tcp::acceptor& acceptor, std::function<void(tcp::socket&&)> f); + +void accept_connection(tcp::acceptor& acceptor, std::shared_ptr<tcp::socket> socket, boost::system::error_code ec, std::function<void(boost::asio::ip::tcp::socket&&)> 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<void(tcp::socket&&)> f) +{ + std::shared_ptr<tcp::socket> new_socket = std::make_shared<tcp::socket>(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<void(tcp::socket&&)> 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<void (tcp::socket &&)> accept_handler) +{ + acceptor.open(endpoint.protocol()); + acceptor.bind(endpoint); + acceptor.listen(); + + accept_loop(acceptor, accept_handler); +} |
