2016-07-24 7 views
0

Ich teste auf libuv für Server.Wie warten Sie auf weitere Daten in libuv?

Das Problem ist, dass die Daten teilweise ankommen und ich auf weitere Daten warten muss. (diese Situation noch nicht stattgefunden hat, aber ich denke, es ist um die Ecke, in meiner Erfahrung)

Aber diese libuv ist auf Ereignisbasis abhängig, und im nächsten after_read() Funktion garantiert nicht das nächste Paket würde sei der Rest.

Ich frage mich, wie Sie arbeiten. Danke.


Für weitere Informationen hinzugefügt. Meine betroffene Situation von gespaltenen Paket.

  • Angenommen Client A, Client B, Server S.

    1. A 100 Bytes an den Server sendet.
    2. B sendet 100 Bytes an den Server.
    3. S empfängt die ersten 50 Bytes von A. (in gelesenem Rückruf)
    4. S empfängt B 100 Bytes. (im Lese-Callback)
    5. S empfängt A Rest 50 Bytes. (In Lese Rückruf)

Nach Schritt 3 erwarte ich den Rest 50bytes A ist zu kommen, aber im Gegensatz zu meiner Erwartung, B 100 Bytes ankommen. Mein Ziel ist es, Schritt 3 (50 Bytes) + Schritt 5 (50 Bytes) für die gesamten Daten von A zusammenzuführen.

Antwort

2

In libuv warten Sie nicht auf Daten, Sie fordern an, dass Daten durch Aufruf von uv_read_start gelesen werden, und dann wird der gelesene Rückruf aufgerufen, wenn Daten zu lesen sind. Wenn Ihre Anwendung vollständige Datenpakete lesen muss, möchten Sie in der Regel eine Zustandsmaschine verwenden, um zu wissen, in welchem ​​Status Sie sich befinden, und Daten zwischenzuspeichern, bis Sie ein vollständiges Paket haben.

+0

Vielen Dank für Ihren Kommentar, Saghul. Ich kenne die Grundfunktion von uv_read_start und Callback-Funktion. Aber ich bin besorgt über zerbrochene Päckchen. Ich habe mehr Erklärungen zu meinem Beitrag hinzugefügt. Muss ich das gesamte Paket verwalten oder gibt es eine gute Möglichkeit, mit der Paketreihenfolge und dem Fragment umzugehen? –

+0

Ich glaube nicht, dass Sie ohne eine Zustandsmaschine und einige Pufferung damit umgehen können. Für jede Verbindung puffern Sie ein Paket und vermeiden die Verarbeitung bis zum Abschluss. Wenn Sie UDP verwenden, benötigen Sie eine Zuordnung zwischen der Quelladresse und dem Paketpuffer, wodurch die Dinge komplizierter werden. libuv hat keine eingebaute Einrichtung, um Ihnen hier zu helfen, da dies sehr anwendungsspezifisch ist. – saghul

+0

Ja. Ich denke auch, dass es anwendungsspezifisch ist, aber ich habe aus Angst vor meiner Unwissenheit gefragt. Ich überlege mir, genau in diesem Moment einen Puffer für bestimmte Größen pro Client zuzuweisen. Danke für deinen Rat. –

Verwandte Themen