2016-05-22 26 views
0

Ich muss vollständige Byte-Pakete in meinem benutzerdefinierten Format über TCP übertragen. Aber wenn ich richtig verstehe TCP ist Streaming-Protokoll, so wenn ich send Methode auf der Senderseite aufrufen, gibt es keine Garantie, dass es auf der Empfängerseite mit der gleichen Größe empfangen wird, wenn Anruf recv (Es kann zusammen mit Nagles Algorithmus und dann zusammengeführt werden aufgeteilt, wenn sie nicht in den Rahmen passen oder nicht zum Puffern geeignet sind).Korrekte Architektur zum Senden von "Datagrammen" über TCP

UDP bietet vollständige Datagramme, so dass es kein Problem gibt.

Also Frage ist: was wird der beste und korrekte Weg zu recv gleichen Pacakges wie es war send, mit gleicher Größe, ohne Klebstoff. Ich entwickle mit Python.

Ich denke, ich kann etwas wie HDLC verwenden, aber ich bin mir nicht sicher, ob die Iteration durch jedes Byte die beste Wahl ist. Vielleicht gibt es einige Open-Source-Beispiele für diese Situation oder es ist in Büchern beschrieben?

+0

Was meinst du mit "kein Kleber"? Keine Indikatoren um die einzelnen Telegramme, um deren Anfang und Ende zu zeigen? Wenn das der Fall ist, warum? Weil es der am weitesten verbreitete Weg ist, um diese Art von Situation zu lösen. – fvu

+0

Mit "no leim" meine ich, dass ich einzelne Telegramme nehmen muss, nicht Chunks mit mehreren Telegrammen in einem Stream Chunk. Ok, so ist es üblich, einige Indikatoren (mehrere Bytes) zwischen meinen Paketen auf der Senderseite hinzuzufügen und sie auf dem Empfänger zu analysieren? Wenn diese Bytes im Paket vorhanden sind, muss ich es umgehen, es sieht nicht effizient aus, aber ich werde es berücksichtigen. Ich dachte auch darüber nach, reale Paketgrößen zwischen Paketen hinzuzufügen, um zu wissen, wie viele Bytes ich für das nächste volle Paket benötige, und es wird helfen, zu entscheiden, ob das volle Paket im aktuellen Chunk oder im nächsten ist, aber vielleicht gibt es einige Standardalgorithmen? – user3479125

+1

Siehe: https://en.wikipedia.org/wiki/Type-length-value –

Antwort

2

Da TCP nur ein Oktettstrom ist, ist dies ohne Kleber nicht möglich, entweder um Ihre Daten (d. H. Framing) oder innerhalb Ihrer Daten (Struktur mit klarem Ende).

Die Art, wie dies normalerweise getan wird, ist entweder durch ein Trennzeichen (wie \r\n\r\n zwischen HTTP-Header und Körper) oder einfach Präfix Ihre Nachricht mit der Größe. Im letzteren Fall lesen Sie einfach die Größe (feste Anzahl der Bytes) und lesen Sie dann diese Anzahl der Bytes für die eigentliche Nachricht.