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

Boost.Asio - 非同期処理で同期処理を書く

C++

boost::asio:read and timeout - Boost User ML


同期処理というか、非同期処理をその場で待機して結果を得る、ですが。
Boost.Lambdaと組み合わせるとその場で書けるようになります。
同期処理でタイムアウトを設定する場合はこのやり方で書くようです。

#include <string>
#include <boost/asio.hpp>
#include <boost/lambda/lambda.hpp>

namespace asio = boost::asio;

class Client {
    asio::io_service& io_service_;
    asio::ip::tcp::socket socket_;

public:
    Client(asio::io_service& io_service)
        : io_service_(io_service), socket_(io_service_) {}

    void connect()
    {
        socket_.connect(asio::ip::tcp::endpoint(asio::ip::address::from_string("127.0.0.10"), 31400));
    }

    void send()
    {
        using namespace boost::lambda;

        const std::string data = "abc";

        // 非同期処理を開始
        boost::system::error_code ec;
        asio::async_write(socket_, boost::asio::buffer(data), var(ec) = _1);

        // 終わるまで待つ
        do io_service_.run_one(); while (ec == boost::asio::error::would_block);

        if (ec) {
            std::cout << "send error : " << ec.message() << std::endl;
        }
        else {
            std::cout << "send ok" << std::endl;
        }
    }
};

int main()
{
    asio::io_service io_service;

    Client client(io_service);

    client.connect();
    client.send();
}