boost asio async_read



  • Hallo

    ich lese mich gerade in boost::asio ein und wollte wissen wie async_read/async_write genau funktionieren.

    Beispiel:
    Mein Client sendet mir 256 Bytes. Mein Buffer ist aber nur 128 Bytes groß.

    void read_handler(const boost::system_error::error_code &error, const std::size_t bytes_transferred) {
    }
    

    2 Fragen:

    1. So wie ich das verstanden habe wird der read_handler 2x aufgerufen oder?

    2. Wenn ich nicht weiß wie viel bytes der Client mir senden will, woher weiß ich wann der read/write Vorgang fertig ist?

    3. Der übergebene Buffer an async_read/async_write muss anscheinend länger existieren, also er darf nicht lokal sein, richtig?

    Ich würde am liebsten gerne die Beispiele kompilieren und mit ihnen experementieren, aber mein Standrechner ist eingegangen und am Netbook ist das alles nur frustrierend.

    Hoffe jemand nimmt sich die Zeit für mich und kann mir meine Fragen beantworten.

    Danke im voraus!



  • Tut mir Leid für den 2. Beitrag hintereinander aber wäre es nicht für mein gegebenes Beispiel besser ein boost::asio::streambuf zu verwenden? Wenn ich das richtig verstanden habe, wächst die Größe automatisch 😕



  • 1. So wie ich das verstanden habe wird der read_handler 2x aufgerufen oder?

    Mindestens zweimal ja. Nicht zwingend genau zweimal.

    2. Wenn ich nicht weiß wie viel bytes der Client mir senden will, woher weiß ich wann der read/write Vorgang fertig ist?

    Dazu brauchst Du ein Protokoll. D.h. eine Abmachung zwischen Client und Server, wie und was für Nachrichten ausgetauscht werden.
    Bsp.
    a.) Alle Nachrichten sind gleichlang
    b.) Oder es gibt ein Header pro Nachricht, welcher immer gleich lang ist (z.B. 4 Bytes) und die Länge des Gesamtnachricht enthält (in eben diesen 4 Bytes).
    c.) Oder ein Pattern welches den Start / bzw. das Ende einer Nachricht markiert.

    3. Der übergebene Buffer an async_read/async_write muss anscheinend länger existieren, also er darf nicht lokal sein, richtig?

    Richtig, nicht lokal in der Funktion. Entweder mit new anlegen oder aber z.B. als Member der Klasse, welche async_read aufruft.

    Simon



  • Vielen Dank theta!

    Wieso nicht zwingend 2x ? Stehe momentan auf dem Schlauch



  • Weil auch so was passieren kann:
    30 Bytes -> read handler
    100 Bytes -> read handler
    100 Bytes -> read handler
    26 Bytes -> read handler

    Und wenn der Client 2 * 256 Bytes sendet kann es auch so passieren:
    128 Bytes -> read handler
    100 Bytes -> read handler
    100 Bytes -> read handler
    56 Bytes -> read handler
    128 Bytes -> read handler

    TCP ist ein Stream - Message Grenzen müssen im Applikations Protokoll abgehandelt werden.

    Edit:
    Oh, natürlich immer weniger als 128 Bytes - da dein Buffer so klein ist. Aber ich glaube das Grundsätzliche Problem kommt rüber.
    -> Bsp angepasst!



  • Ah, ja vielen Dank nochmals theta für deine Antworten!



  • theta schrieb:

    3. Der übergebene Buffer an async_read/async_write muss anscheinend länger existieren, also er darf nicht lokal sein, richtig?

    Richtig, nicht lokal in der Funktion. Entweder mit new anlegen oder aber z.B. als Member der Klasse, welche async_read aufruft.

    Simon

    Was passiert aber wenn mehrmals hintereinander async_read aufgerufen wird? Gibt es dann eine Race-Condition?


Anmelden zum Antworten