2017-09-28 2 views
1

Ich versuche, ein AsyncReadStream Strom implementieren von std :: cin und bisher haben Sie den folgenden Code zu lesen:Wie schreibt Daten auf eine 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)); 
    } 

Ich bin mir bewusst, dass einige der Code im obigen Blockieren, wenn es nicht wirklich sein sollte, aber das ist neben meinem Problem hier (glaube ich). Ich habe die Dokumentation für MutableBufferSequence http://www.boost.org/doc/libs/1_41_0/doc/html/boost_asio/reference/MutableBufferSequence.html überprüft und es scheint keine offensichtliche Möglichkeit, dies zu tun. Offensichtlich verstehe ich etwas drastisch.

+0

Vielleicht ist dies meine Frage ansewwrs. Ich werde später überprüfen und löschen, wenn duplicate: https://stackoverflow.com/questions/17241770/how-to-write-to-a-boostasiomutable-buffer?rq=1 –

+0

Nein, es antwortet nicht. Es geht nicht um Puffersequenzen. – sehe

+0

In Bezug auf die verknüpfte Antwort sollte ['buffer_cast'] (http://www.boost.org/doc/libs/1_65_1/doc/html/boost_asio/reference/buffer_cast.html) nur nach sorgfältiger Abwägung (B. Scatter-Read- oder Gather-Write-Puffer, bei denen der zugrunde liegende Speicher nicht zusammenhängend ist. Stattdessen sollte man oft typsichere Iteratoren über ['buffers_begin'] (http://www.boost.org/doc/libs/1_65_1/doc/html/boost_asio/reference/buffers_begin.html) und [' buffers_end' verwenden ] (http://www.boost.org/doc/libs/1_65_1/doc/html/boost_asio/reference/buffers_end.html). –

Antwort

2

Ich würde das streambuf überspringen (warum zweimal kopieren?).

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

(wo ba:: abkürzt boost::asio::).

Beachten Sie auch, dass read_some wahrscheinlich nicht das ist, was Sie wollten (std::cin.readsome always reading 0 bytes).

es zu benutzen:

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

anzeigen Live On Coliru

+0

Danke nochmal Sehe. Ich werde akzeptieren, wenn ich die Chance bekomme zu testen. –

+0

Schön gemacht. Erwägen Sie, Handler über ['asio_handler_invoke()'] (http://www.boost.org/doc/libs/1_65_1/doc/html/boost_asio/reference/asio_handler_invoke.html) aufzurufen, um benutzerdefinierte Aufrufstrategien zu ermöglichen. –

+0

@TannerSansbury Ich überlegte, dies zu tun, konnte aber keinen Grund dazu finden, da wir den Handler nur als übergeben aufrufen, also entfernte ich ihn wieder. Gibt es einen Grund, es in diesem Fall hinzuzufügen? (Ich habe gerade gemerkt, dass 'my_read_some' immer noch eine falsche Bezeichnung ist, aber naja, für den Moment) – sehe

Verwandte Themen