ネットワーク ライブラリの作業中に、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))ます。戻り値:書き込まれた文字数。