套接字编程:消息失败检查.有谁知道一个原因的幻想?

Pau*_*tos 1 sockets data-transfer

现在我有一个由客户端和服务器组成的通信基础设施.

客户端使用标准TCP套接字连接到服务器.

我有一个消息结构如下:

4 bytes -- Message size
n bytes -- Message
4 bytes -- CRC32 checksum
Run Code Online (Sandbox Code Playgroud)

其中一个要求是,有效的消息必须通过连接另一端的CRC32检查,客户端或服务器以相同的方式处理消息.

如果消息未通过CRC32检查,则断开连接并建立新连接.

我的问题是为什么我随机得到CRC32失败?

没有明显的原因,即使同一台机器上的客户端和服务器都使用环回地址(127.0.0.1).

我认为即使我已经在恶意第三方或其他东西的情况下编写了故障保护程序,我也绝不会在测试期间看到连接丢失.

cni*_*tar 6

你没有显示任何代码,所以我只能猜测.

  • 您正在从套接字读取字节而不检查读取的大小.TCP是一种面向流的协议,因此无法保证为发送整个数据而必须执行的读取次数.唯一的保证是,在未指定数量的读取之后,使用未指定数量的段,您将获得所有八位字节,按顺序

  • 您的校验和函数因某些输入而失败,因为它不正确

第一个可能是正在发生的事情.您正在读取一些数据和recv/read返回,其读取的字节数比您预期的少.

顺便说一句,你确实意识到你想要做的正确吗?

  • 以太网帧具有CRC-32字段
  • IPv4数据包具有16b头校验和
  • TCP段有一个16-b校验和,覆盖标题,数据和一些
  • 您的数据也将具有CRC-32

你意识到这是多余的,对吗?