Struktur vom TCP-Empfang nach Längenpräfix deserialisieren
Problem:
Beim Deserialisieren eines Benutzers Wenn die Struktur über TCP von einem separaten Computer empfangen wird, ist eine Ausnahme aufgetreten: „System.Runtime.InteropServices.SafeArrayTypeMismatchException“.
Ursprüngliche Implementierung:
Die Struktur enthält Serialisierungsmethoden zum Vorbereiten und Abrufen von Daten vor und nach dem Senden. Den gesendeten Bytes wird ein Header im Format „l=xxxx;“ hinzugefügt, um die Größe der eingehenden Daten anzugeben. Das empfangende Ende sucht nach diesem Header, extrahiert die Paketbytes und versucht, sie zu deserialisieren.
Ausnahmeursache:
Die Hauptursache liegt in der Abhängigkeit von a Zeichenfolge zur Bestimmung der Paketlänge. Dieser Ansatz kann zu Inkonsistenzen bei der Datenübertragung über das Netzwerk führen.
Lösung:
Längenpräfixierung implementieren:
Anstatt eine Header-Zeichenfolge zu verwenden, implementieren Sie die richtige Längenpräfixierung. Dabei wird jedem gesendeten „Paket“ ein fester Header hinzugefügt, der die Länge der Daten angibt. Diese Länge wird in Bytes umgewandelt, was 4 Bytes ergibt. Anschließend werden der Datenheader und das Paket selbst angehängt.
Paketstruktur:
[Länge (4 Bytes)][Header (1 Byte)][Daten (x Byte(s)]
Paketempfang und Parsen:
Das obige ist der detaillierte Inhalt vonWie deserialisiere ich zuverlässig eine Struktur aus einem TCP-Stream mit Längenpräfix?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!