diff options
Diffstat (limited to 'libcmix-network/connect.cpp')
| -rw-r--r-- | libcmix-network/connect.cpp | 38 |
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); +} |
