7 #ifndef CPPWAMP_INTERNAL_TCPACCEPTOR_HPP
8 #define CPPWAMP_INTERNAL_TCPACCEPTOR_HPP
12 #include <boost/asio/connect.hpp>
13 #include <boost/asio/ip/tcp.hpp>
14 #include <boost/asio/strand.hpp>
15 #include "../asiodefs.hpp"
27 using Socket = boost::asio::ip::tcp::socket;
28 using SocketPtr = std::unique_ptr<Socket>;
30 template <
typename TExecutorOrStrand>
31 TcpAcceptor(TExecutorOrStrand&& exec,
const std::string addr,
33 : strand_(std::forward<TExecutorOrStrand>(exec)),
34 endpoint_(boost::asio::ip::address::from_string(addr), port)
37 template <
typename TExecutorOrStrand>
38 TcpAcceptor(TExecutorOrStrand&& exec,
unsigned short port)
39 : strand_(std::forward<TExecutorOrStrand>(exec)),
40 endpoint_(boost::asio::ip::tcp::v4(), port)
46 void establish(F&& callback)
51 typename std::decay<F>::type callback;
57 self->acceptor_.reset();
58 self->socket_.reset();
60 callback(ec, std::move(self->socket_));
64 assert(!socket_ &&
"Accept already in progress");
67 acceptor_.reset(
new tcp::acceptor(strand_, endpoint_));
68 socket_.reset(
new Socket(strand_));
71 acceptor_->async_accept(*socket_,
72 Accepted{
this, std::forward<F>(callback)});
82 using tcp = boost::asio::ip::tcp;
85 tcp::endpoint endpoint_;
86 std::unique_ptr<tcp::acceptor> acceptor_;
95 #endif // CPPWAMP_INTERNAL_TCPACCEPTOR_HPP