ブースト 1.40.0 以降、async_read_some()
呼び出しの動作方法が変更されたようです。
以前は、 anull_buffer
を渡すことができ、読み取るデータがあるときにコールバックを取得できましたが、フレームワークがデータをバッファーに読み取ることはありませんでした (バッファーがなかったからです!)。これにより、基本的に、呼び出しのように機能するコードを記述できselect()
、ソケットにデータがあるときに通知されます。
新しいコードでは、動作が次のように変更されました。
シーケンス mb 内のすべてのバッファーの合計サイズが 0 の場合、非同期読み取り操作は直ちに完了し、読み取りバイト数を指定するハンドラーへの引数として 0 を渡します。
これは、ソケット上のデータを検出する私の古い方法 (そして、この公式の例に示されている方法) が機能しなくなったことを意味します。私にとっての問題は、asio ソケット ストリームの上に独自のストリーミング クラスを階層化しているため、これを検出する方法が必要なことです。そのため、ストリームが期待するソケットからデータを読み取ることはできません。現在考えられる唯一の回避策は、1 バイトを読み取って保存し、ストリーム クラスがいくつかのバイトを要求したときに、設定されている場合はそのバイトを返すことです。きれいではありません。
最新のboost.asioコードでこの種の動作を実装するより良い方法を知っている人はいますか?