読者です 読者をやめる 読者になる 読者になる

Boost.Asio resolver iteratorを引数にとる接続関数

C++

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()を繰り返すだけの単純なラッパーとなっています。