Boost 1.47.0のBoost.Asioから、名前解決の結果であるresolver iteratorを引数にとるフリー関数版のconnect()とasync_connect()が提供されます。
これを使えば、名前解決して接続、という流れがとても書きやすくなります。
#include <boost/asio.hpp> #include <boost/bind.hpp> #include <iostream> namespace asio = boost::asio; using asio::ip::tcp; class Client { asio::io_service& io_service_; tcp::socket socket_; public: Client(asio::io_service& io_service) : io_service_(io_service), socket_(io_service) { } void connect() { tcp::resolver resolver_(io_service_); tcp::resolver::query query("google.com", "http"); // フリー関数版async_connect。 asio::async_connect( socket_, resolver_.resolve(query), boost::bind(&Client::on_connect, this, asio::placeholders::error)); } private: void on_connect(const boost::system::error_code& error) { if (error) { std::cout << "connect error : " << error.message() << std::endl; } else { std::cout << "connect!" << std::endl; } } }; int main() { asio::io_service io_service; Client client(io_service); client.connect(); io_service.run(); }
フリー関数版connect()/async_connect()は、接続できるまでresolver iteratorを巡回し、close()とconnect()を繰り返すだけの単純なラッパーとなっています。