7 #ifndef CPPWAMP_INTERNAL_TCPOPENER_HPP
8 #define CPPWAMP_INTERNAL_TCPOPENER_HPP
13 #include <boost/asio/connect.hpp>
14 #include <boost/asio/ip/tcp.hpp>
15 #include <boost/asio/strand.hpp>
16 #include "../asiodefs.hpp"
17 #include "../tcphost.hpp"
30 using Socket = boost::asio::ip::tcp::socket;
31 using SocketPtr = std::unique_ptr<Socket>;
33 template <
typename TExecutorOrStrand>
34 TcpOpener(TExecutorOrStrand&& exec, Info info)
35 : strand_(std::forward<TExecutorOrStrand>(exec)),
36 info_(std::move(info))
42 void establish(F&& callback)
47 typename std::decay<F>::type callback;
49 void operator()(
AsioErrorCode ec, tcp::resolver::iterator iterator)
53 self->resolver_.reset();
54 callback(ec,
nullptr);
57 self->connect(iterator, std::move(callback));
61 assert(!resolver_ &&
"Connect already in progress");
63 resolver_.reset(
new tcp::resolver(strand_));
65 tcp::resolver::query query(info_.hostName(), info_.serviceName());
68 resolver_->async_resolve(query,
69 Resolved{
this, std::forward<F>(callback)});
81 using tcp = boost::asio::ip::tcp;
84 void connect(tcp::resolver::iterator iterator, F&& callback)
89 typename std::decay<F>::type callback;
93 self->resolver_.reset();
95 self->socket_.reset();
96 callback(ec, std::move(self->socket_));
97 self->socket_.reset();
102 socket_.reset(
new Socket(strand_));
103 socket_->open(boost::asio::ip::tcp::v4());
104 info_.options().applyTo(*socket_);
107 boost::asio::async_connect(*socket_, iterator,
108 Connected{
this, std::forward<F>(callback)});
113 std::unique_ptr<tcp::resolver> resolver_;
121 #endif // CPPWAMP_INTERNAL_TCPOPENER_HPP