diff options
| author | Dennis Brentjes <d.brentjes@gmail.com> | 2016-08-29 13:29:30 +0200 |
|---|---|---|
| committer | Dennis Brentjes <d.brentjes@gmail.com> | 2016-08-29 13:29:30 +0200 |
| commit | a736abb4e3668771f248e7400a093cb40b5313b7 (patch) | |
| tree | ccd7b225f1138dc2743ee64aadc7bf11635c9bc9 /network-handler/networkhandler.cpp | |
| parent | 00ab2cf6add2976b3a4e8f8cc488777ad5c27808 (diff) | |
| download | cmix-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/networkhandler.cpp')
| -rw-r--r-- | network-handler/networkhandler.cpp | 72 |
1 files changed, 22 insertions, 50 deletions
diff --git a/network-handler/networkhandler.cpp b/network-handler/networkhandler.cpp index 987d2a1..8c5997f 100644 --- a/network-handler/networkhandler.cpp +++ b/network-handler/networkhandler.cpp @@ -1,6 +1,7 @@ #include "networkhandler.hpp" #include <boost/bind.hpp> +#include <boost/asio/placeholders.hpp> #include <memory> #include <iostream> @@ -8,48 +9,25 @@ using namespace boost::asio::ip; using namespace boost::asio; -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)); -} - -void setup_listen_socket(tcp::acceptor& acceptor, tcp::endpoint& endpoint, std::function<void(tcp::socket&& socket)> f) { - acceptor.open(endpoint.protocol()); - acceptor.bind(endpoint); - acceptor.listen(); - - accept_loop(acceptor, f); -} - NetworkHandler::NetworkHandler(const ListenSettings& listen_settings) : listen_settings(listen_settings) , io_service() -, v4_acceptor(io_service) -, v6_acceptor(io_service) -, v4_endpoint(address_v4::from_string(listen_settings.ipv4_inaddr), listen_settings.port) -, v6_endpoint(address_v6::from_string(listen_settings.ipv6_inaddr), listen_settings.port) +, v4_acceptor(io_service, address_v4::from_string(listen_settings.ipv4_inaddr), listen_settings.port) +, v6_acceptor(io_service, address_v6::from_string(listen_settings.ipv6_inaddr), listen_settings.port) +, stdin_buffer() +, clients() { auto accept_handler = [this](tcp::socket&& socket) { - accepted_connections.push_back(std::move(socket)); - std::cout << "Yippie" << std::endl; + clients.push_back(Client(std::move(socket))); + auto it = --clients.end(); + + clients.back().set_on_done( + [this, it]() { + clients.erase(it); + } + ); + + clients.back().receive(); }; /* @@ -58,28 +36,22 @@ NetworkHandler::NetworkHandler(const ListenSettings& listen_settings) * respective inaddr_any we need to bind to v6 any and disable ipv6 only on * the acceptor socket, else we can just bind to the interfaces normally. */ - bool bind_v4_any = v4_endpoint.address().to_v4() == address_v4::any() && listen_settings.enable_ipv4; - bool bind_v6_any = v6_endpoint.address().to_v6() == address_v6::any() && listen_settings.enable_ipv6; + bool bind_v4_any = v4_acceptor.get_address().to_v4() == address_v4::any() && listen_settings.enable_ipv4; + bool bind_v6_any = v6_acceptor.get_address().to_v6() == address_v6::any() && listen_settings.enable_ipv6; if(bind_v4_any && bind_v6_any) { - v6_acceptor.open(v6_endpoint.protocol()); - - v6_only option(false); - v6_acceptor.set_option(option); - - v6_acceptor.bind(v6_endpoint); - v6_acceptor.listen(); - - accept_loop(v6_acceptor, accept_handler); + v6_acceptor.bind_v6_and_v4_any(accept_handler); } else if(bind_v4_any || bind_v6_any) { throw std::runtime_error("Cannot bind an INADDR_ANY and a non INADDR_ANY address on ipv4 and ipv6"); } else { if(listen_settings.enable_ipv4) { - setup_listen_socket(v4_acceptor, v4_endpoint, accept_handler); + v4_acceptor.setup_listen_socket(accept_handler); } if(listen_settings.enable_ipv6) { - setup_listen_socket(v6_acceptor, v6_endpoint, accept_handler); + v6_acceptor.setup_listen_socket(accept_handler); } } + + //read_stdin(); } void NetworkHandler::run() { |
