2017-08-07 7 views
1

準備使用する方法を、私は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()の役割を明確にすることができます。なぜ、それを繰り返し呼び出す必要がありますか?

答えて

1

streambufは、カスタムアロケータを使用してstd::vector<char>として実装されています。 prepareは、単に要求された量のメモリを割り当てます。それは複数回呼び出す必要はありません。

あなたは、単にメインループ外アキュムレータを移動全ての受信データを保存するために

std::string accumulated_data; 
while (connected) { 
    ... 
    accumulated_data.append(
     boost::asio::buffers_begin(inbufs), 
     boost::asio::buffers_begin(inbufs) + bytes_read); 
    ... 
} 

警告:これは周波数との合計数に応じて非常に非効率的になることが原因メモリに「追加」割り当てと移動/コピー。しかし、私はあなたがデータで何をしたいのかという手がかりがないので、私が思いつくのが最良です。

+0

私の場合、最初のチャンクが読み込まれた後に予想されるデータの合計サイズを見積もることができるので、accum_data.reserve()を呼び出して周波数メモリの再割り当てを避けることができます。 – edj

0

ASIO ::バッファは単にコンテナです。 詳細情報については、hereをご覧ください!

asio :: bufferが呼び出されると、OSとComplierはどのくらいの量のメモリを割り当てるべきかを理解しません。 buffer.prepare(/ * Memory Size * /)はその空間を提供するメンバ関数として呼び出されます。

受信または送信されないデータが文字化けする可能性がある場合は、常にバッファに一定のメモリサイズを割り当てることを推奨します。

関連する問題