1 /* Icinga 2 | (c) 2012 Icinga GmbH | GPLv2+ */
6 #include "base/i2-base.hpp"
7 #include "base/io-engine.hpp"
8 #include "base/socket.hpp"
9 #include <boost/asio/ip/tcp.hpp>
10 #include <boost/asio/spawn.hpp>
16 * A TCP socket. DEPRECATED - Use Boost ASIO instead.
20 class TcpSocket final : public Socket
23 DECLARE_PTR_TYPEDEFS(TcpSocket);
25 void Bind(const String& service, int family);
26 void Bind(const String& node, const String& service, int family);
28 void Connect(const String& node, const String& service);
32 * TCP Connect based on Boost ASIO.
36 template<class Socket>
37 void Connect(Socket& socket, const String& node, const String& service)
39 using boost::asio::ip::tcp;
41 tcp::resolver resolver (IoEngine::Get().GetIoContext());
42 tcp::resolver::query query (node, service);
43 auto result (resolver.resolve(query));
44 auto current (result.begin());
48 socket.open(current->endpoint().protocol());
49 socket.set_option(tcp::socket::keep_alive(true));
50 socket.connect(current->endpoint());
53 } catch (const std::exception&) {
54 if (++current == result.end()) {
58 if (socket.is_open()) {
65 template<class Socket>
66 void Connect(Socket& socket, const String& node, const String& service, boost::asio::yield_context yc)
68 using boost::asio::ip::tcp;
70 tcp::resolver resolver (IoEngine::Get().GetIoContext());
71 tcp::resolver::query query (node, service);
72 auto result (resolver.async_resolve(query, yc));
73 auto current (result.begin());
77 socket.open(current->endpoint().protocol());
78 socket.set_option(tcp::socket::keep_alive(true));
79 socket.async_connect(current->endpoint(), yc);
82 } catch (const std::exception&) {
83 if (++current == result.end()) {
87 if (socket.is_open()) {
96 #endif /* TCPSOCKET_H */