通过校验和快速验证1500字节的内存 我正在编写一个C++程序,它将1500字节的数据从机器A发送到机器B/

通过校验和快速验证1500字节的内存 我正在编写一个C++程序,它将1500字节的数据从机器A发送到机器B/,c++,buffer,checksum,C++,Buffer,Checksum,假设如下: 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(); 如果rxLength==1500,我们已经收到了1500字节的数据,但我们需要确保它与我们发送的1500字节相同(而不是来自其他地方的1500字节的数据,在网络中传输)!通常,在比较少量用户输入

假设如下:

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();
如果
rxLength==1500
,我们已经收到了1500字节的数据,但我们需要确保它与我们发送的1500字节相同(而不是来自其他地方的1500字节的数据,在网络中传输)!通常,在比较少量用户输入时,例如,可能会使用
strncmp()
。我并不认为
strncmp()
在这里是合适的,但我想说的是,在接收端设置一个缓冲区不是一个好主意,它可能被称为
expected\u data
,例如,它包含1500个x'a',我循环并比较这两个,比如
strncmp()


如何有效地评估接收到的1500字节数据?[我说的高效是指快速。这种情况每秒会发生数千次,因此代码需要相当优化!]。我有一个关于某种校验和的想法,因为我们知道我们应该接收什么,但我不确定有什么好方法可以做到这一点。有人能推荐一个好的校验和方法吗?或者,如果这是一个愚蠢的想法,你能解释为什么,也许推荐其他的东西?

< P>首先考虑你从机器A发送到机器B的1500字节数据的具体过程,并检查你在这个过程中是否有可能造成任何损失或腐败的步骤。在这种情况下,您的流程可能没有任何引入这些步骤的步骤。例如,如果您使用TCP/IP发送数据,那么底层TCP/IP堆栈将保证正确接收您的数据


如果另一方面你有一些步骤引入数据丢失、腐败、订单更改等,那么如果你重视性能那么多,你应该考虑CRCs。您可以在这里找到使用CRC的详细说明和源代码示例:

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

这就是为什么要这样做。但是,如果您知道将收到什么,为什么要发送任何东西呢?最有效的方法是不进行任何验证,因为网络堆栈会为您完成校验和。任何在网络中被破坏的数据都将被丢弃,因此用户级校验和是冗余的,除非你偏执到不相信操作系统的网络实现做正确的事情。你可以对每个字符的std::hash的
size\u t
结果进行异或运算。有各种校验和/crc/错误检测/消息身份验证/纠错方案。它们都在检测错误的程度(以及检测到或未检测到的错误类型)和所需资源方面进行权衡。因此,您可能需要添加一些有关目标系统的信息(例如,小型嵌入式系统可能没有资源来完成简单的CRC16)。如果您真的想进行自己的检查,则需要让发送方计算数据的校验和,并将该校验和包含在数据中。接收器可以在收到数据后再次重新计算校验和,并将其计算的校验和与数据中包含的校验和进行比较,并验证它们是否匹配。至于使用什么样的校验和算法,几乎所有的校验和算法都可以工作,因为校验和不需要太多CPU。CRC确实是正确的方法:它们很可能捕获任何随机损坏,并以网络速度运行。“安全散列”仅用于防止故意破坏。
rxLength = recvfrom(sock, rxdata, 1500, 0, NULL, NULL);
           //             ^ the buffer we are putting into