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