準備使用する方法を、私はread_someとサーバを実装しました。私のサーバーループは、ソケットから受信したすべてのデータを蓄積します。以下のストールダウンコードは正しく動作しませんが、inbuf.prepare()ステートメントをループ内に移動することで修正できます。ASIOストリームバッファ可変バッファ・タイプは、 - ASIOスタンドアロンを使用して()
(準備asio::streambuf inbuf;
asio::streambuf::mutable_buffers_type inbufs = inbuf.prepare(4096);
while(connected)
{
asio::error_code ec;
size_t bytes_read = Socket().read_some(inbufs,ec);
inbuf.commit(bytes_read);
std::string s = std::string(asio::buffers_begin(inbufs),
asio::buffers_begin(inbufs) + inbuf.size());
inbuf.consume(bytes_read);
}
)はループの外側にあり、合計バイトが読み取ら接続が4096の境界を跨ぐを確立したため、文字列sは、その境界までのデータを有することになります。つまり、sはbytes_readよりも短くなります。私は、ループの外側でprepare()を保持したい場合、次のような消費ループが必要だと推測しましたが、これはどちらもうまくいきませんでした。
asio::streambuf inbuf;
asio::streambuf::mutable_buffers_type inbufs = inbuf.prepare(4096);
while(connected)
{
asio::error_code ec;
size_t bytes_read = Socket().read_some(inbufs,ec);
while(bytes_read > 0)
{
inbuf.commit(bytes_read);
std::string s = std::string(asio::buffers_begin(inbufs),
asio::buffers_begin(inbufs) + inbuf.size());
inbuf.consume(inbuf.size());
bytes_read -= s.size();
}
}
誰でもprepare()の役割を明確にすることができます。なぜ、それを繰り返し呼び出す必要がありますか?
私の場合、最初のチャンクが読み込まれた後に予想されるデータの合計サイズを見積もることができるので、accum_data.reserve()を呼び出して周波数メモリの再割り当てを避けることができます。 – edj