gpt4 book ai didi

c - 使用 TCP/IP 通过网络发送可变大小的数据包

转载 作者:可可西里 更新时间:2023-11-01 02:48:22 24 4
gpt4 key购买 nike

我想通过内部网络在 2 个 Linux 操作系统之间发送可变大小的数据包。数据包的大小可变,其长度和 CRC 在 header 中指示, header 也随数据包一起发送。大致像-

struct hdr {
uint32 crc;
uint32 dataSize;
void *data;
};

我在应用层使用 CRC 来克服固有的 limitation of TCP checksums

我遇到的问题是,dataSize 字段本身有可能损坏,在这种情况下,我不知道下一个数据包从哪里开始?因为在接收方,当我读取套接字缓冲区时,我读取了 n 个这样的数据包。所以 dataSize 是我可以正确到达下一个数据包的唯一方法。

我的一些想法是-

  1. 如果发生 CRC 不匹配,请重新启动连接。
  2. X 个这样的数据包聚合成一个固定大小的大数据包,如果检测到任何CRC 错误则丢弃该大数据包。大数据包是为了确保我们丢失 <= 一个数据包的 sizeof 以防出错

对于这些可变大小的数据包还有其他想法吗?

最佳答案

由于 TCP 是基于流的,因此数据长度是提取完整消息以供应用程序处理的常用方法。如果您认为由于某种原因长度字节本身是错误的,那么除了丢弃数据包“刷新”连接并期望发送方和接收方重新同步之外,我们无能为力。但最好是断开线路,除非应用层有协议(protocol)可以重新同步连接。

除长度字节之外的另一种方法是使用标记。消息开始和消息结束。应用程序遇到 Start-of-Message 应开始收集数据,直到收到 End-of-Message 字节,然后进一步处理该消息。这要求消息适本地转义标记。

关于c - 使用 TCP/IP 通过网络发送可变大小的数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40415864/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com