aboutsummaryrefslogtreecommitdiff
path: root/network-handler/acceptor.cpp
diff options
context:
space:
mode:
authorDennis Brentjes <d.brentjes@gmail.com>2016-08-29 13:29:30 +0200
committerDennis Brentjes <d.brentjes@gmail.com>2016-08-29 13:29:30 +0200
commita736abb4e3668771f248e7400a093cb40b5313b7 (patch)
treeccd7b225f1138dc2743ee64aadc7bf11635c9bc9 /network-handler/acceptor.cpp
parent00ab2cf6add2976b3a4e8f8cc488777ad5c27808 (diff)
downloadcmix-a736abb4e3668771f248e7400a093cb40b5313b7.tar.gz
cmix-a736abb4e3668771f248e7400a093cb40b5313b7.tar.bz2
cmix-a736abb4e3668771f248e7400a093cb40b5313b7.zip
Adds the Acceptor and Client class.
The acceptor combines the endpoint and acceptor to reduce clutter in NetworkHandler class. The client will handle the connection for the network handler for every separate client. The networkhander now has a std::list of Client, to keep track and ownership of all the Clients.
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);
+}