Maison > développement back-end > C++ > Comment désérialiser de manière fiable une structure à partir d'un flux TCP à préfixe de longueur ?

Comment désérialiser de manière fiable une structure à partir d'un flux TCP à préfixe de longueur ?

DDD
Libérer: 2025-01-03 07:08:40
original
548 Les gens l'ont consulté

How to Reliably Deserialize a Struct from a Length-Prefixed TCP Stream?

Désérialiser la structure à partir de la réception TCP après le préfixage de la longueur

Problème :

Lors de la désérialisation d'un message personnalisé struct reçue via TCP depuis une machine distincte, une exception est rencontrée : "System.Runtime.InteropServices.SafeArrayTypeMismatchException".

Implémentation originale :

La structure inclut des méthodes de sérialisation pour préparer et récupérer les données avant et après l'envoi. Un en-tête est ajouté aux octets envoyés pour indiquer la taille des données entrantes, au format "l=xxxx;". L'extrémité réceptrice recherche cet en-tête, extrait les octets du paquet et tente de les désérialiser.

Cause d'exception :

La cause fondamentale réside dans le recours à un chaîne pour la détermination de la longueur des paquets. Cette approche peut entraîner des incohérences lors du transfert de données sur le réseau.

Solution :

Implémenter le préfixage de la longueur :

Au lieu d'utiliser une chaîne d'en-tête, implémentez un préfixe de longueur approprié. Cela implique d'ajouter un en-tête fixe à chaque « paquet » envoyé, représentant la longueur des données. Cette longueur est convertie en octets, ce qui donne 4 octets. L'en-tête de données et le paquet lui-même sont ensuite ajoutés.

Structure du paquet :

[Longueur (4 octets)][En-tête (1 octet)][Données (x octet(s))]

Réception des paquets et Analyse :

  1. Lisez les 4 premiers octets (longueur), convertissez-les et attribuez-les à une variable entière.
  2. Lisez l'octet suivant (en-tête de données) et stockez-le dans une variable.
  3. Lire x octets dans un tableau d'octets, où x est l'entier de l'étape 1.
  4. Utilisez l'en-tête de données de l'étape 2 pour déterminer quoi faire avec les données.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal