From: Alexander A. Klimov Date: Mon, 25 Feb 2019 15:40:14 +0000 (+0100) Subject: Connect(): add non-async overload X-Git-Tag: v2.11.0-rc1~140^2~2 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d1e87bdc4506b4bc10e2740ff3465c04b7ed0a49;p=icinga2 Connect(): add non-async overload --- diff --git a/lib/base/tcpsocket.hpp b/lib/base/tcpsocket.hpp index 069288aad..0f8334f01 100644 --- a/lib/base/tcpsocket.hpp +++ b/lib/base/tcpsocket.hpp @@ -27,6 +27,35 @@ public: void Connect(const String& node, const String& service); }; +template +void Connect(Socket& socket, const String& node, const String& service) +{ + using boost::asio::ip::tcp; + + tcp::resolver resolver (socket.get_io_service()); + tcp::resolver::query query (node, service); + auto result (resolver.resolve(query)); + auto current (result.begin()); + + for (;;) { + try { + socket.open(current->endpoint().protocol()); + socket.set_option(tcp::socket::keep_alive(true)); + socket.connect(current->endpoint()); + + break; + } catch (const std::exception&) { + if (++current == result.end()) { + throw; + } + + if (socket.is_open()) { + socket.close(); + } + } + } +} + template void Connect(Socket& socket, const String& node, const String& service, boost::asio::yield_context yc) {