#include "connect.hpp" #include "logging.hpp" #include #include 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::basic_resolver resolver(io_service); boost::asio::ip::basic_resolver_query query(host, port); for(auto it = resolver.resolve(query); it != boost::asio::ip::tcp::resolver::iterator(); ++it) { boost::system::error_code ec; boost::asio::ip::tcp::socket socket(io_service); socket.connect(*it, ec); if(ec) { continue; } else { return socket; } } 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 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 on_connect) { boost::asio::ip::basic_resolver resolver(socket.get_io_service()); boost::asio::ip::basic_resolver_query query(host, next_port); auto it = resolver.resolve(query); async_connect_iteration(socket, it, on_connect); }