2011-01-13 18 views
23

私のboost::asioアプリケーションにD-Busを統合しようとしています。Boost Asioを使用したファイルディスクリプタでの非同期待機

D-Busには、監視対象となるUnixファイルディスクリプタ(主にソケットですが、FIFOでも構いません)のセットを列挙するAPIがあります。 これらのディスクリプタに何かがある場合は、D-Bus APIに読み書きできるように通知する必要があります。

は現在、私はこれをやっている:

using boost::asio::posix::stream_descriptor; 
void read_handle(stream_descriptor* desc, const boost::system::error_code& ec, 
       std::size_t bytes_read) 
{ 
    if (!ec) { 
     stream_descriptor::bytes_readable command(true); 
     descriptor->io_control(command); 
     std::size_t bytes_readable = command.get(); 
     std::cout << "It thinks I should read" << bytes_readable 
      << " bytes" << std::endl; 
    } else { 
     std::cout << "There was an error" << std::endl; 
    } 
} 

void watch_descriptor(boost::asio::io_service& ios, int file_descriptor) 
{ 
    // Create the asio representation of the descriptor 
    stream_descriptor* desc = new stream_descriptor(ios); 
    desc->assign(file_descriptor); 

    // Try to read 0 bytes just to be informed that there is something to be read 
    std::vector<char> buffer(0); 
    desc->async_read_some(boost::asio::buffer(buffer, 0), 
     boost::bind(read_handle, desc, _1, _2)); 
} 

しかしハンドラは、それを読み取ることが0バイトであると言ってすぐに呼ばれています。読みたいものがあるときだけ呼び出されるようにしたいですが、boost :: asio を読んでください。それは賛美されたように行動するべきですselect()。それを行う簡単な方法はありますか?

PS:私のソフトウェアには広くboost::asioを使用していますが、これはほんの一部であるため、glibまたは他のメインループには依存しません。

+0

使用しているD-Bus APIとは何ですか?低レベルのC APIですか? –

答えて

26

null_buffersは、正確にはdesignedでした。

時にはプログラムは は、I/O操作自体を実行したいサードパーティのライブラリと を統合する必要があります。 これを容易にするために、Boost.Asio には、 を読み取りと書き込みの両方で使用できるnull_buffersタイプが含まれています。 操作。 null_buffers操作 は、I/Oオブジェクトが操作を実行する準備ができて " "になるまで戻りません。一例として、

、 非ブロッキングを実行するには、次の のようなものを読んで使用することができます

ip::tcp::socket socket(my_io_service); 
... 
ip::tcp::socket::non_blocking nb(true); 
socket.io_control(nb); 
... 
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)); 
    } 
} 

ドキュメントに含まexcellent exampleもあります。

+0

これは私が探していたものでした。完璧に統合されています。どうもありがとう! –

+1

こんにちはサム、あなたが言及したドキュメントに含まれている優れた例についてもっと詳しく説明できますか?私は 'third_party_lib.session'をRead/AsyncRead/Write/AsyncWriteの何かに使いたいのですが、どうすればいいですか?私はまだそれほど明確ではない。 third_party_libをシミュレートした例は私を実際に混乱させました。ありがとう。 –

+0

@Peter新しい質問をしてください。混乱しているサンプルのどの部分を含めるかを含めてください。 –

関連する問題