2011-12-09 16 views
2

私はboost :: asioを使って非同期に読み込もうとしているネイティブposixソケットを持っています: :async_read。しかし、私がこれを行うとき:boost :: asio :: async_readを使用していませんが、boost :: asio :: readは動作します(io_stream.run_one()を使用しています)

カウント変数は0に設定され、doReadハンドラは決して呼び出されず、ecにはエラーはありません。私は同期リードして非同期読み込みを交換する場合は:

size_t count = asio::read(stream, buffer, 
          asio::transfer_at_least(1)); 

これが動作し、私は戻って、カウント変数のデータの予想量を取得します。

"int pipe(int pipefd [2]);"によって作成されたfdを使用している私のテストケースは、

  • が、それは私が渡していますネイティブ記述子は何らかの方法でasync_readと互換性がありませんどのようにいくつかあるので:そしてASIO :: async_readでその作業罰金を介してデータを渡すので、私はそれはオプションのカップル可能性が考えています静かに失敗する。私は利用できないようにオンとオフをブロックして作成しようとしました。
  • io_serviceとposix :: stream_descriptorは接続されていないため、io_serviceは決して読み込みを実行しようとしません。これは私がio_serviceを参照渡ししていることが原因でしょうか? (そして数スレッド内でも同様です)
+0

'stream_descriptor'は、' pipe'の読み込み側の記述子でうまく動作します。[this](http://stackoverflow.com/questions/5210796/boost-asio-how-to-write-コンソールサーバー/ 5211349#5211349)回答。私はあなたの2番目の弾丸が、あなたが見る行動の原因だと思っています。あなたの質問を編集し、私たちが分析するために[短く、自己完結型の、正しい例](http://sscce.org/)を含めてください。 –

+0

私はここに自宅でコードを持っていないので、仕事で月曜日に一緒に1つを得るでしょう、ありがとう! –

答えて

1

問題が見つかりました。

所有オブジェクトの初期化機能でio_service.stop()を呼び出していましたが、再初期化が可能です。私はio_service.reset()を呼び出してもstopの呼び出しの後ではなかったし、resetが呼び出されるまで停止してもio_serviceは実行されません。

停止とリセットの両方としてRTFMのレッスンがこれを文書化しています。

しかし、boost :: system :: error_code変数にはこの状態が反映されていませんでした。これは、私が悩まされてしまったように、ちょっとイライラしています。

関連する問題