2013-06-28 8 views
7

Boost Asioで次のことを行います。私はソケットを持っていて、ソケット上でデータの読み書きが可能なときに呼び出されるコールバックを登録したいが、実際に読み書きをしたくない。基本的には、実際の読み書きが行われていないことを除いて、私が必要とするものはasync_read_some/async_write_someに似ています。Asioでソケットを読み書きできるようになるまで非同期に待機する

入力パラメータとしてソケット記述子を必要とする独自の読み書き機能を持つ外部ライブラリを使用していて、このライブラリを非同期で使用したいので、これが必要です。

+0

async_connect、async_write、async_readを使用するコードを使用しますか? – mattn

+0

async_readおよびasync_writeのみ。ライブラリはすでに確立されている接続のソケットを使用するため、自分自身で接続を行うことができます。したがって、async_connectを自分で使用することができます。 – petersohn

答えて

8

原子炉型の操作を探しています。これらは、非同期操作にboost::asio::null_buffersを指定することで取得できます。反応器形式の操作等、共有メモリ・プールを使用して、サードパーティのライブラリを統合するのに有用であり得るBoost.Asio documentationは、いくつかの情報と、次のサンプルコードを提供する:

ip::tcp::socket socket(my_io_service); 
... 
socket.non_blocking(true); 
... 
socket.async_read_some(null_buffers(), read_handler); 
... 
void read_handler(boost::system::error_code ec) 
{ 
    if (!ec) 
    { 
    std::vector<char> buf(socket.available()); 
    socket.read_some(buffer(buf)); 
    } 
} 

Boost.Asioも公式nonblocking exampleを提供しますソケット上で直接読み書き操作を実行するライブラリとの統合方法を示しています。

+0

'null_buffers'はBoost 1.66.0以降で非推奨です:[_"(非推奨:ソケット/ディスクリプタwait()とasync \ _wait()メンバ関数を使用してください) "_"(http://www.boost.org /doc/libs/1_66_0/doc/html/boost_asio/reference/null_buffers.html) – sehe

関連する問題