aboutsummaryrefslogtreecommitdiff
path: root/libcmix-network/connect.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libcmix-network/connect.cpp')
-rw-r--r--libcmix-network/connect.cpp38
1 files changed, 33 insertions, 5 deletions
diff --git a/libcmix-network/connect.cpp b/libcmix-network/connect.cpp
index 679748e..bf200d5 100644
--- a/libcmix-network/connect.cpp
+++ b/libcmix-network/connect.cpp
@@ -1,23 +1,24 @@
#include "connect.hpp"
+#include "logging.hpp"
+
#include <boost/asio/ip/basic_resolver.hpp>
+#include <boost/asio/ip/address.hpp>
using namespace boost::asio::ip;
using boost::asio::io_service;
-boost::asio::ip::tcp::socket connect(std::string host, std::string port, io_service& io_service) {
+boost::asio::ip::tcp::socket connect(std::string host, io_service& io_service) {
boost::asio::ip::basic_resolver<tcp> resolver(io_service);
- boost::asio::ip::basic_resolver_query<tcp> query(host, port);
- boost::asio::ip::basic_endpoint<tcp> endpoint;
+ boost::asio::ip::basic_resolver_query<tcp> query(host, "");
for(auto it = resolver.resolve(query); it != boost::asio::ip::tcp::resolver::iterator(); ++it)
{
- endpoint = *it;
boost::system::error_code ec;
boost::asio::ip::tcp::socket socket(io_service);
- socket.connect(endpoint, ec);
+ socket.connect(*it, ec);
if(ec) {
continue;
} else {
@@ -27,3 +28,30 @@ boost::asio::ip::tcp::socket connect(std::string host, std::string port, io_serv
throw std::runtime_error("None of the supplied endpoints responded");
}
+
+void async_connect_iteration(tcp::socket& socket, boost::asio::ip::tcp::resolver::iterator it, std::function<void()> on_connect) {
+ if(it == boost::asio::ip::tcp::resolver::iterator()) {
+ throw std::runtime_error("None of the supplied endpoints responded");
+ }
+
+ auto handler = [&socket, it, on_connect](boost::system::error_code const& ec) {
+ if(ec) {
+ BOOST_LOG_TRIVIAL(info) << ec << std::endl;
+ async_connect_iteration(socket, std::next(it), on_connect);
+ } else {
+ on_connect();
+ }
+ };
+
+ socket.async_connect(*it, handler);
+}
+
+void async_connect(tcp::socket& socket, std::string host, std::string next_port, std::function<void()> on_connect)
+{
+ boost::asio::ip::basic_resolver<tcp> resolver(socket.get_io_service());
+ boost::asio::ip::basic_resolver_query<tcp> query(host, next_port);
+
+ auto it = resolver.resolve(query);
+
+ async_connect_iteration(socket, it, on_connect);
+}