2012-03-27 11 views
0

デリミタが見つかるまで読み込むboost :: asio :: async_read_untilのバージョンを実装する最も簡単な方法は何ですか?適切な量​​のバイトを消費する方法を知っている特別な一致条件を実装できますか?そうでなければ、各バイトをチェックする非同期リーダーを書く方法は?真のブーストを実装するもっとも簡単な方法:: asio :: async_read_until

指定されたstreambufがデリミタを超えてバイトを消費するのを止める必要があります。この場合

std::pair<iterator, bool> 
match_whitespace(iterator begin, iterator end) 
{ 
    iterator i = begin; 
    while (i != end) 
    if (std::isspace(*i++)) 
     return std::make_pair(i, true); 
    return std::make_pair(i, false); 
} 

それは(あなたが欲しいものに応じて変更のstd :: isspace)空白に一致します。documentationあなたは、単純なmatch関数を見つけることができるで

答えて

1

。私がする必要がある

// Function used for error handling 
void handler(const boost::system::error_code& e, std::size_t size) 
{ 
// Do something 
} 

// Example of call, it reads from inputStream to outputStreamBuff 
// until the specified delimiter (";") is found 
boost::asio::async_read_until(inputStream, outputStreamBuff, 
    match_char(';'), handler); 
0

class match_char 
{ 
public: 
    explicit match_char(char c) : c_(c) {} 

    template <typename Iterator> 
    std::pair<Iterator, bool> operator()(
     Iterator begin, Iterator end) const 
    { 
    Iterator i = begin; 
    while (i != end) 
     if (c_ == *i++) 
     return std::make_pair(i, true); 
    return std::make_pair(i, false); 
    } 

private: 
    char c_; 
}; 

、そのクラスを使用するコード:再びそのドキュメントで使用すると、より複雑なイベントを見ることができ、それは特定の文字を見つけるまで、それはストリームを消費します指定されたstreambufが 区切り文字を超えるバイトを消費しないようにします。

これを達成する唯一の方法は、ストリームから一度に1バイトずつ(非効率的に)読み取ることです。私はdocumentationが容易に成功したasync_read_until操作の後、このシナリオ

を処理する方法について説明し、ストリームバッファは 区切り文字を超えて追加データを含むことができ、このアプローチを示唆しています。アプリケーションは のasync_read_until操作の後の 操作のために、そのデータをstreambufに残します。

これはまさにasync httpクライアントexampleの機能です。

0

this documentの備考は、何回テストしても実際には間違っていることを指摘したいと思います。

備考成功async_read_until動作の後、ストリームバッファ 関数オブジェクトに一致するものを超えた追加データを含むことができます。アプリケーションは通常、そのデータをstreambuf に残して、それ以降のasync_read_until操作で調べます。

MatchConditionファンクタは次のasync_read_untilために消費されていないバイトを残していない、ストリームバッファであることをすべて消費する必要があります()を呼び出すか、あなたのアプリケーションは永遠に待つことがあります。

P.S.テストのセットアップはx86-64 centos4.3 kernel-2.6.32 gcc4.8です。

+0

さらにテストセットアップ用:boost_1-59-0 –

関連する問題