aboutsummaryrefslogtreecommitdiff
path: root/network-handler/acceptor.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'network-handler/acceptor.cpp')
-rw-r--r--network-handler/acceptor.cpp59
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);
+}