首页 > 后端开发 > C++ > 如何从长度前缀的 TCP 流中可靠地反序列化结构?

如何从长度前缀的 TCP 流中可靠地反序列化结构?

DDD
发布: 2025-01-03 07:08:40
原创
548 人浏览过

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

在长度前缀后反序列化来自 TCP 接收的结构

问题:

反序列化自定义时通过 TCP 从单独的机器接收结构体时,遇到异常: “System.Runtime.InteropServices.SafeArrayTypeMismatchException”。

原始实现:

该结构包括用于在发送之前和之后准备和检索数据的序列化方法。发送的字节中会添加一个标头,以指示传入数据的大小,格式为“l=xxxx;”。接收端搜索此标头,提取数据包字节,并尝试反序列化它们。

异常原因:

根本原因在于依赖于用于确定数据包长度的字符串。这种方法可能会导致通过网络传输数据时出现不一致。

解决方案:

实现长度前缀:

不要使用标头字符串,而是实施适当的长度前缀。这涉及到向发送的每个“数据包”添加固定标头,表示数据的长度。该长度转换为字节,结果为 4 个字节。然后附加数据头和数据包本身。

数据包结构:

[长度(4 字节)][标头(1 字节)][数据(x byte(s))]

数据包接收和解析:

  1. 读取前4个字节(Length),转换并赋值给整型变量。
  2. 读取下一个字节(Data Header)并将其存储在一个变量。
  3. 将 x 个字节读入字节数组,其中 x 是步骤 1 中的整数。
  4. 使用步骤 2 中的数据标头以确定如何处理数据。

以上是如何从长度前缀的 TCP 流中可靠地反序列化结构?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板