Boost.Asio ソケットで非同期接続

徐々にBoost.Asioも触っていこうと思います。


async_connectを使用すると、非同期に接続処理が行われ、接続完了もしくは失敗時にハンドラが呼ばれます。
デフォルトではerror_codeのみがハンドラに渡されますが、boost::bindを併用してソケットや他の情報を持ちまわることもできます。

#include <iostream>
#include <boost/asio.hpp>

namespace asio = boost::asio;
namespace ip = boost::asio::ip;

void connect_handle(const boost::system::error_code& error)
{
    if (error)
        std::cout << error << std::endl;
    else
        std::cout << "success" << std::endl;
}

int main()
{
    asio::io_service ios;

    ip::tcp::socket soc(ios);
    soc.async_connect(ip::tcp::endpoint(ip::address::from_string("127.0.0.1"), 31400),
                      connect_handle);

    ios.run();
    for (;;) {}
}
success

以下サーバー側のコード。
単にacceptして切断してるだけです。

#include <iostream>
#include <boost/asio.hpp>

using namespace std;
using namespace boost::asio;
using ip::tcp;

int main()
{
    io_service io;

    tcp::acceptor acc(io, tcp::endpoint(tcp::v4(), 31400));

    for (;;) {
        tcp::iostream s;
        acc.accept(*s.rdbuf());

        cout << "[connect start]" << endl;

        cout << "[connect end]" << endl;
    }
}