を受け取るリクエスト メソッドを持つネットワーク クライアントがありますstd::streambuf*
。このメソッドは、データをネットワーク API に書き込む方法を知っているboost::iostreams::copy
カスタム派生クラスにそれを渡すことによって実装されます。これはうまく機能します。std::streambuf
これは、すべてのファイルをメモリに読み込む必要なく、ファイルをリクエストにストリーミングできることを意味します。
ただし、ファイルにない大きなデータ ブロックを送信する必要がある場合もあるため、文字列を受け取るオーバーロードを含めました。ストリーム内のすべてのネットワーク コードが重複しないようにするには、文字列を表す を設定してstreambuf
、別のメソッドを呼び出す必要があることは明らかです。これを機能させるために私が見つけた唯一の方法は、次のようなものでした。
std::istringstream ss(data);
send(ss.rdbuf());
残念ながら、istringstream
場合によっては数メガバイトのデータのコピーを作成します。もちろん、一般的なケースでは完全に理にかなっています。あるオブジェクトへの const 参照を渡す場合、そのオブジェクトがその参照を引き続き使用できると仮定して、そのオブジェクトを望まない場合です。
私はこれを次のように回避しました:
struct zerocopy_istringbuf
: public std::stringbuf
{
zerocopy_istringbuf(std::string const* s)
: std::stringbuf(std::ios::in)
{
char* p = const_cast<char*>(s->c_str());
setg(p, p, p + s->length());
}
};
...
send(&zerocopy_istringbuf(data));
これはうまく機能しているように見えますが、本当に必要なのだろうか。std::istringstream
を受け取るオーバーロードがないのはなぜstd::string const *
ですか? これを行うより良い方法はありますか?