2

ネットワーク ライブラリの作業中に、basic_streambuf::in_avail へのペンダントを writesome 関数と組み合わせて使用​​すると、非同期 I/O に非常に便利であることに最近気付きました。

これらの要求を満たす関数があるかどうか、Web を検索し、いくつかの C++ リファレンスを確認しましたが、運がなかったようです。同様の機能について言及している唯一の情報源はBoost の Asioライブラリですが、説明には、目的の動作を反映しない少なくとも 1 バイトが送信されるまで関数呼び出しがブロックされることが明確に記載されています。

私の質問を詳しく説明するために、C++ N3337 の出版物に基づいてラフ ドラフトを作成しました。

27.6.3.2.5 プット領域 [streambuf.pub.put]

streamsize in_depart();

戻り値:書き込み位置が使用可能な場合、 を返しますepptr() - pptr()。それ以外の場合は を返しますshowmanycp()

27.6.3.4.5 プット領域 [streambuf.virt.put]

streamsize showmanycp();

戻り値:シーケンスに書き込むことができる文字数の見積もり、または-1. 正の値が返された場合、少なくともその数の文字がストリームに書き込まれるまで、への連続した呼び出しoverflow()は返されません。を返すtraits::eof()場合、 への呼び出しは失敗します。showmanycp()-1overflow()

デフォルトの動作:ゼロを返します。

備考:使用してtraits::eof()います。

27.7.3.7 フォーマットされていない出力関数 [ostream.unformatted]

streamsize writesome(char_type* s, streamsize n);

効果:フォーマットされていない出力関数として動作します (27.7.3.7、パラグラフ 1 で説明されているように)。歩哨オブジェクトを構築した後、例外をスローして戻る可能性のあるif!good()呼び出し。それ以外はで指定された文字をsetstate(failbit)書き込みます。の場合 、((27.5.5.4)をスローする可能性がある ) を呼び出し、文字を書き込みません。nsrdbuf()->in_depart() == -1setstate(badbit)ios_base::failure

— の場合rdbuf()->in_depart() == 0、文字を書き込みません。

— の場合rdbuf()->in_depart() > 0、文字を書き込みmin(rdbuf()->in_depart(), n))ます。

戻り値:書き込まれた文字数。

4

1 に答える 1

2

in_avail()andの意味を誤解していると思いますreadsome()。これらはすべて、ストリームがデータのブロックを読み取ったが、バッファにはまだ文字があるということです。はい、理論的には別のことを行うことができますが、特にネットワークから読み取るときは、読み取ってみるまで利用可能なデータの量がわかりません。

同様に、特定の数の文字を削除できることを保証する方法はありません。どういうout.writesome(buf, n)意味ですか? n文字をのバッファにダンプしたことを意味したい場合はout、適切なストリーム バッファを作成して を使用できますwrite()。ただし、バイトがブロッキングで送信されることを保証することnはできません (少なくとも については1 < n)。ただし、後者が必要だと思います。

于 2012-09-17T12:40:06.933 に答える