diff options
Diffstat (limited to 'libcmix-network/accept.cpp')
| -rw-r--r-- | libcmix-network/accept.cpp | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/libcmix-network/accept.cpp b/libcmix-network/accept.cpp new file mode 100644 index 0000000..3fa4314 --- /dev/null +++ b/libcmix-network/accept.cpp @@ -0,0 +1,48 @@ + +#include "accept.hpp" + +#include <boost/bind.hpp> +#include <boost/asio/placeholders.hpp> + +using namespace boost::asio::ip; +using namespace boost::asio; + +void accept_connection(tcp::acceptor& acceptor, std::shared_ptr<tcp::socket> socket, boost::system::error_code ec, std::function<void (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, placeholders::error, f)); +} + +void accept_connection(tcp::acceptor& acceptor, std::shared_ptr<ssl::context> ctx, std::shared_ptr<ssl::stream<tcp::socket>> socket, boost::system::error_code ec, std::function<void (ssl::stream<tcp::socket>&&)> 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<ssl::context> ctx, std::function<void(ssl::stream<tcp::socket>&& socket)> f) { + + std::shared_ptr<ssl::stream<tcp::socket>> new_socket = std::make_shared<ssl::stream<tcp::socket>>(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)); +} |
