Sockets 套接字编程:消息检查失败。有人知道什么原因吗?

Sockets 套接字编程:消息检查失败。有人知道什么原因吗?,sockets,data-transfer,Sockets,Data Transfer,现在我有一个由客户端和服务器组成的通信基础设施 客户端使用标准TCP套接字连接到服务器 我有一个消息结构,如下所示: 4 bytes -- Message size n bytes -- Message 4 bytes -- CRC32 checksum 其中一个要求是,要使消息有效,必须在连接的另一端通过CRC32检查,客户机或服务器以相同的方式处理消息 如果消息未通过CRC32检查,则连接将断开并建立新连接 我的问题是为什么我会随机出现CRC32故障 没有明显的原因,即使客户端和服务器在同

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

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

我有一个消息结构,如下所示:

4 bytes -- Message size
n bytes -- Message
4 bytes -- CRC32 checksum
其中一个要求是,要使消息有效,必须在连接的另一端通过CRC32检查,客户机或服务器以相同的方式处理消息

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

我的问题是为什么我会随机出现CRC32故障

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


我想,即使我已经在恶意第三方或其他情况下对故障保护进行了编程,我也不会在测试期间看到断开的连接。

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

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

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

第一个可能是发生了什么。您正在读取一些数据,recv/read返回的字节数比预期的要少

顺便说一句,你确实意识到你在努力做什么,对吗

以太网帧有一个CRC-32字段 IPv4数据包具有16b报头校验和 TCP段有一个16-b校验和,包括报头、数据和一些数据 您的数据还将具有CRC-32
你知道这是多余的,对吧?

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

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

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

第一个可能是发生了什么。您正在读取一些数据,recv/read返回的字节数比预期的要少

顺便说一句,你确实意识到你在努力做什么,对吗

以太网帧有一个CRC-32字段 IPv4数据包具有16b报头校验和 TCP段有一个16-b校验和,包括报头、数据和一些数据 您的数据还将具有CRC-32
您意识到它是多余的,对吗?

顺便说一句,在接收方检查校验和的正确方法是对整个消息和校验和进行计算,将其视为较长的消息。结果应该是零。这样,您就可以在计算中包含校验和本身。错误的方法是在不包括校验和的消息上计算校验和,然后与接收到的校验和进行比较。

顺便说一句,在接收方检查校验和的正确方法是在整个消息和校验和上计算校验和,共同视为较长的消息。结果应该是零。这样,您就可以在计算中包含校验和本身。错误的方法是计算不包括校验和的消息上的校验和,然后与收到的校验和进行比较。

我最好的猜测是,您的校验和代码中存在错误。你能给我们看一些最小的示例代码吗?我假设在读/写时有一个错误,例如,假设recv总是返回所需的精确数据长度,与send类似,或者在代码检查/创建CRC时有一个错误。发布一些代码将大大有助于澄清这一点,并帮助我们帮助您。我最好的猜测是,您的校验和代码中存在错误。你能给我们看一些最小的示例代码吗?我假设在读/写时有一个错误,例如,假设recv总是返回所需的精确数据长度,与send类似,或者在代码检查/创建CRC时有一个错误。发布一些代码将大大有助于澄清这一点,并帮助我们帮助您。冗余观察+1。我曾经使用过一些协议,其中包含某种帧字节,用于标记消息的结束或开始。这允许您确保邮件的发件人没有发送与MessageSize不匹配的损坏邮件。这可能有助于确认消息是否有效,而无需对冗余观测求助于CRC计算+1。我曾经使用过一些协议,其中包含某种帧字节,用于标记消息的结束或开始。这允许您确保邮件的发件人没有发送损坏的邮件
消息大小不匹配。这可能会有助于确认消息是否有效,而不必求助于CRC计算。您能否详细说明这应该如何工作?因为我从未听说过,我很好奇:你描述的错误方式有什么特别的错误?在我看来,在work==生成校验和不匹配错误(如果数据损坏)的情况下,这两种方法都可以工作,但我可能缺少一些细节。校验和定义为消息上的XOR余数,因此将其包含在计算中必须产生零。由于我给出的原因,这是一种更好的方法:它不假设校验和本身被正确传输。可以想象以兼容的方式损坏消息和校验和的损坏:这会捕获它们。您能详细介绍一下这是如何工作的吗?因为我从未听说过,我很好奇:你描述的错误方式有什么特别的错误?在我看来,在work==生成校验和不匹配错误(如果数据损坏)的情况下,这两种方法都可以工作,但我可能缺少一些细节。校验和定义为消息上的XOR余数,因此将其包含在计算中必须产生零。由于我给出的原因,这是一种更好的方法:它不假设校验和本身被正确传输。可以想象以兼容方式损坏消息和校验和的损坏:这会捕获它们。