通过校验和快速验证1500字节的内存

时间:2012-05-21 19:38:18

标签: c++ buffer checksum

我正在用C ++编写一个程序,它将1500字节的数据从机器A发送到机器B.

假设如下:

char* tx_data = (char*)operator new(1500)
for (int i = 0; i < 1500; i++) {
  tx_data[i] = (char)((int) 65); // ASCII 65 = A;
}
send_tx_data();

所以我们用字母“A”1500次来填充这个缓冲区(tx_data)。接收主机抓取传入数据并将其转储到缓冲区(rx_data),并获取接收数据的长度(rxLength);

rxLength = recvfrom(sock, rxdata, 1500, 0, NULL, NULL);
           //             ^ the buffer we are putting into

如果rxLength == 1500,我们收到了1500字节的数据,但我们需要确保它们是我们发送的相同的1500字节(而不是来自其他地方的1500字节数据,在网络中飞行)!通常,在比较一些少量用户输入时,可能会使用strncmp()。我并不是说strncmp()在这里是合适的,我所说的是,我不认为在接收端有一个可能被称为expected_data的缓冲区是个好主意。例如,它包含1500 x'A',我循环并比较两者,如strncmp()

如何以有效的方式评估收到的1500字节数据? [有效率我的意思很快。这将每秒发生数千次,因此代码需要相当优化!]。我对某种校验和有一个想法,因为我们知道应该接收什么,但我不确定这是一个好方法。谁能建议一个好的校验和方法?或者,如果这是一个愚蠢的想法,你能解释一下为什么,也许可以推荐其他东西吗?

2 个答案:

答案 0 :(得分:2)

首先考虑从机器A向机器B发送1500字节数据的具体过程,并检查您是否在此过程中有任何可能引起任何损失或损坏的步骤。可能是您的流程没有任何介绍任何这些的步骤。例如,如果您使用TCP / IP发送数据,则可以保证您的数据(如果有的话)由底层TCP / IP堆栈正确接收。

另一方面,如果你有一些步骤引入数据丢失,损坏,订单更改等,你应该考虑CRC,如果你重视性能那么多。您可以在此处找到有关使用CRC的详尽说明和源代码示例:http://www.barrgroup.com/Embedded-Systems/How-To/CRC-Calculation-C-Code

答案 1 :(得分:0)

在哈希函数和CRC的多个建议之后,我使用了从this answer到另一个问题的代码,来创建一个简单的哈希函数。