boost::asio::async_read_until
を使用して、TCPソケットから\n
-ended行を読み取ります。ここでstreambufのASIO ForwardIteratorをブーストする
void-or-deduced async_read_until(
AsyncReadStream & s,
boost::asio::basic_streambuf<Allocator> & b,
char delim,
ReadHandler handler);
boost::asio::streambuf b;
は、受信したデータを格納するための自動リサイズ対象である:私はasync_read_until
署名は、次のされていることを思い出してくださいしてみましょう。
私が理解する限り、内部的にバッファシーケンス、boost :: asioバッファのリストで構成されています。しかし、ForwardIteratorを取得して、複数の連続した領域で構成されるこの内部バッファを反復処理する簡単な方法はありません。
私は、次の使用パターンを見つける:
std::istream stream(&b);
std::istream_iterator<char> end;
std::istream_iterator<char> begin(stream);
はしかし、ここend
とbegin
はInputIteratorsです。
同時に、を酔っぱらっラインから得られた解析するために使用することができるboost::spirit::phrase_parse(begin, end, grammar, space, obj)
パーサはbegin
end
とはForwardIteratorsことが必要です
http://www.boost.org/doc/libs/1_63_0/libs/spirit/doc/html/spirit/support/multi_pass.html
これは、バックトラッキングのために必要とされます。しかし、データは実際にはすでにboost::asio::streambuf b
オブジェクト内のメモリバッファに格納されていますが、イテレータが複数回参照解除されることはありません。
私は自分自身のイテレータ(BufferSequenced要素を1つずつ繰り返します)を書き、b.data()を使ってそれを反復することができます。しかし、私は標準的な方法があるべきだと思います... – 0x2207
@Nim単純にマルチパスでstreambuf_iteratorを適応させることができます(boost :: spirit :: istream_iteratorはistream_iteratorに適応します)。しかしそれは不必要です。 Asioのバッファ・イテレータが要件を満たすことを促進する、私の答えを見てください。 – sehe