2017-09-28 7 views
1

에 데이터를 작성하는 방법 :나는 표준 : CIN에서 읽으려는 AsyncReadStream 스트림을 구현하기 위해 노력하고 지금까지 다음 코드가 있어요 MutableBufferSequence

template <class MutableBufferSequence, class ReadHandler> 
    void async_read_some(const MutableBufferSequence &buf, ReadHandler handler) { 

    char c[1024] = {}; 
    std::streamsize num = std::cin.readsome(c, 1023); 
    c[num] = 0; 

    boost::asio::streambuf buff(1023); 
    std::ostream os(&buff); 
    os << c; 

    // How do I get the buff into the buf???? I've tried below: 
    //boost::asio::buffered_stream<boost::asio::streambuf> buff_stream(buff); 
    //boost::asio::read(buff_stream, buf); 
    handler(boost::system::error_code(), boost::asio::buffer_size(buf)); 
    } 

내가 알고 있어요을 코드의 일부가 위의 경우 차단하고 있습니다. 실제로는 없어야하지만 내 문제 외에도 있습니다 (제 생각에). MutableBufferSequence http://www.boost.org/doc/libs/1_41_0/doc/html/boost_asio/reference/MutableBufferSequence.html에 대한 설명서를 확인했으며이를 수행 할 분명한 방법이없는 것 같습니다. 분명히 나는 ​​뭔가를 과감하게 오해하고 있습니다.

+0

아마도이 내 질문을 ansewwrs 참조하십시오. 나중에 확인하고 중복 된 경우 삭제됩니다 https://stackoverflow.com/questions/17241770/how-to-write-to-a-boostasiomutable-buffer?rq=1 –

+0

를 아니,이 대답하지 않습니다. 버퍼 시퀀스가 ​​아닙니다. – sehe

+0

링크 된 답변과 관련하여 ['buffer_cast'] (http://www.boost.org/doc/libs/1_65_1/doc/html/boost_asio/reference/buffer_cast.html)는 신중히 고려한 후에 사용해야합니다 (기본 메모리가 인접하지 않은 스 캐터 읽기 또는 수집 쓰기 버퍼를 고려하십시오. 대신에, 하나의 형태는 종종 안전 통해 반복자 ['buffers_begin' (http://www.boost.org/doc/libs/1_65_1/doc/html/boost_asio/reference/buffers_begin.html) 및 [ 'buffers_end' 사용해야 ] (http://www.boost.org/doc/libs/1_65_1/doc/html/boost_asio/reference/buffers_end.html). –

답변

2

나는 streambuf의를 건너 뛸 것 (두 번 복사 이유는 무엇입니까?).

template <class MutableBufferSequence, class ReadHandler> 
void my_read_some(MutableBufferSequence buf, ReadHandler handler) { 

    char tmp[1024] = {}; 

    std::cin.read(tmp, sizeof(tmp)); 
    std::streamsize num = std::cin.gcount(); 

    if(std::cin || num) { 
     ba::buffer_copy(buf, ba::buffer(tmp, num)); 

     handler({}, num); 
    } else { 
     handler(ba::error::eof, num); 
    } 
} 

( ba::boost::asio::을 abbreviates 임).

참고 또한 read_some은 (std::cin.readsome always reading 0 bytes) 원하지 않는 것 같다.

는이 기능을 사용하려면

int main() { 
    std::array<char, 512> block1{}, block2{}; 
    std::vector<ba::mutable_buffers_1> blocks { ba::buffer(block1), ba::buffer(block2) }; 

    auto handler = [&blocks](boost::system::error_code ec, size_t transferred) { 
     if (ec) 
      std::cout << "Error " << ec.message() << "\n"; 
     else { 
      std::cout << "Received " << transferred << " bytes\n-------\n"; 

      std::copy_n(ba::buffers_begin(blocks), transferred, std::ostreambuf_iterator<char>(std::cout)); 
      std::cout << "\n-------\n"; 
     } 
    }; 

    my_read_some(blocks, handler); 
} 

그것이 Live On Coliru

+0

Sehe에게 다시 한 번 감사드립니다. 내가 시험 할 기회를 얻으면 받아 들일거야. –

+0

멋지게 완료되었습니다. 사용자 정의 호출 전략을 사용하려면 ['asio_handler_invoke()'] (http://www.boost.org/doc/libs/1_65_1/doc/html/boost_asio/reference/asio_handler_invoke.html)를 통해 핸들러 호출을 고려하십시오. –

+0

@TannerSansbury 나는 그 일을 고려했지만 이유를 찾지 못했습니다. 왜냐하면 우리가 한 일은 모두 전달 된대로 처리기를 호출하기 때문에 다시 제거했기 때문입니다. 이 경우 추가 할 이유가 있습니까? (나는 단지'my_read_some'이 아직도 잘못된 이름이지만, 지금은 잘 알고 있습니다.) – sehe