Ich schreibe gerade ein Nachrichtenprotokoll über einen TCP-Stream. Der Empfänger muss wissen, wo die Nachrichtengrenzen sind.Schreiben eines Stream-Protokolls: Feld für Nachrichtengröße oder Nachrichtenbegrenzer?
Ich kann entweder senden 1) feste Länge Nachrichten, 2) Größe Felder, so dass der Empfänger weiß, wie groß die Nachricht ist, oder 3) eine eindeutige Nachricht Terminator (ich denke, das kann nirgendwo sonst in der Nachricht verwendet werden) .
Ich werde # 1 aus Effizienzgründen nicht verwenden.
Ich mag # 2, aber ist es möglich, dass der Stream nicht mehr synchron ist?
Ich mag Idee # 3 nicht, weil es bedeutet, Empfänger kann nicht die Größe der Nachricht im Voraus wissen und erfordert auch, dass der Terminator nicht an anderer Stelle in der Nachricht angezeigt wird.
Mit # 2, wenn es möglich ist, aus der Synchronisation zu kommen, kann ich einen Terminator hinzufügen oder bin ich garantiert nie aus der Synchronisation, solange das Sendeprogramm in dem, was es sendet, korrekt ist? Ist es notwendig, # 2 UND # 3 zu tun?
Bitte lassen Sie es mich wissen.
Danke, JBU
_Wenn Sie die Nachrichtengröße bereits zu Beginn der Übertragung wissen, wird es einfacher, Speicherplatz auf der Empfängerseite zuzuweisen._ Ein vorsichtiger Hinweis: Stellen Sie sicher, dass die Speicherzuweisung begrenzt wird. Andernfalls sind Sie anfällig für DDoS-Angriffe mit benutzerdefinierten Paketen, die ein Größenfeld von 2^32-1 haben (oder wie groß Ihre Ganzzahlen auch sind), wodurch Ihr Speicher schnell gefüllt wird. – Kenji