2017-10-20 7 views
1

boost asioのasync_read_untilの使用に関する一般的な質問があります。ドキュメントには、ハンドラが呼び出されたときにバッファ内にさらにデータが存在する可能性があることが記載されています。これを回避し、シーケンス条件が一致した直後にバッファがソケットからバイトを消費しないようにする方法はありますか?boost asio async_read_until一致条件での読み込みを停止する

答えて

1

Q.直接この

ない回避する方法は、ネットワークのトラフィックが(それはパケット指向です)動作方法のため、あります。

もちろん、あなたはかもしれません。送信側が積極的にそれを保証していればプロトコル境界で物事を取得しますが、これはストリームプロトコルにとっては珍しいことです。

Q.とシーケンス条件がマッチした直後ソケットからバイトを消費するからバッファを停止しますか?

いいえ、ただし、バッファの消費を停止することはできます。したがって、たとえば

boost::asio::streambuf sb; 
auto bytes = boost::asio::read_until(socket, sb, "\r\n\r\n"); 

std::istream is(&sb); 
std::string line; 
while (getline(is, line) && !line.empty()) { 
    std::cout << "Received: '" << line << "'\n"; 
} 

// sb still contains un-consumed data, if any 

だけで、その後の読み込みと、それはあなたのための「ストリーム位置を」管理されますのために同じstreambufを使用します。これは有効なパターンです。

関連する問題