2012-03-27 3 views
0

구분 기호가 발견 될 때까지만 읽는 boost :: asio :: async_read_until 버전을 구현하는 가장 쉬운 방법은 무엇입니까? 적정량의 바이트를 소비하는 방법을 알고있는 특별한 일치 조건을 구현할 수 있습니까? 그렇지 않다면 각 바이트를 검사하는 비동기 판독기를 작성하는 방법은 무엇입니까?진정한 부스트를 구현하는 가장 쉬운 방법 :: asio :: async_read_until

제공된 streambuf가 구분 기호 이상으로 바이트를 소비하지 않도록해야합니다. 에서

답변

1

documentation 간단한 일치 기능을 찾을 수 있습니다 : 그것은 공백에 일치하는이 경우 (변경 표준을 :: isspace와 당신이 원하는에 따라)에서

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); 
} 

합니다.

// 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가 분리 문자를 초과하는 바이트를 소비하는 것을 막으십시오.

이 작업을 수행하는 유일한 방법은 스트림에서 한 번에 한 바이트 씩 (비효율적으로) 읽는 것입니다. 나는이 방법을 제안하지 않을의 documentation 쉽게 성공 async_read_until 작업 후이 시나리오

을 처리하는 방법에 대해 설명의 streambuf의는 은 구분 기호 이외의 추가 데이터를 포함 할 수있다. 응용 프로그램은 보통 이 후속 async_read_until 작업을 검사하기 위해 해당 데이터를 streambuf에 남깁니다.

이는 정확히 비동기 http 클라이언트 example의 기능입니다.

0

this document의 비고는 실제로 얼마나 자주 테스트했는지에 관계없이 실제로 올바르지 않다고 지적하고 싶습니다.

주의 성공적인 async_read_until 동작 후 streambuf의 함수 오브젝트 일치하는 그 외에 추가 데이터를 포함 할 수있다. 일반적으로 응용 프로그램에서는 해당 데이터를 streambuf 에 남겨 두어 이후 async_read_until 작업을 검사합니다.

MatchCondition functor는 streambuf에있는 모든 것을 사용하고 다음 async_read_until() 호출을 위해 소비되지 않은 바이트를 남겨 두거나 응용 프로그램이 영원히 기다릴 수 있습니다.

p.s. 테스트 설정은 x86-64 centos4.3 kernel-2.6.32 gcc4.8입니다.

+0

테스트 설정에 대한 자세한 내용 : boost_1-59-0 –

관련 문제