我正在用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字节数据? [有效,我的意思是很快。这将每秒发生数千次,因此代码必须相当优化!]。我知道某种校验和,因为我们知道应该收到什么,但是我不确定这样做的好方法。谁能建议一个好的校验和方法?或者,如果这是一个愚蠢的主意,您能解释一下原因并推荐其他建议吗?
最佳答案
首先,请考虑您从计算机A向计算机B发送1500字节数据的特定过程,并检查该过程中是否有任何步骤可能会造成任何丢失或损坏。在某些情况下,您的过程可能没有引入任何这些步骤的步骤。例如,如果使用TCP / IP发送数据,则可以保证底层TCP / IP堆栈可以正确接收数据(如果有的话)。
另一方面,如果您有一些步骤引入了数据丢失,损坏,顺序更改等问题,那么,如果您非常重视性能,就应该考虑使用CRC。您可以在此处找到使用CRC的详尽说明和源代码示例:http://www.barrgroup.com/Embedded-Systems/How-To/CRC-Calculation-C-Code
关于c++ - 通过校验和快速验证1500字节的内存,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10691494/