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?
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
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
Siehe: https://en.wikipedia.org/wiki/Type-length-value –