我正在编写一个简单的程序来发送和接收icmp消息。
我编写了以下代码来计算icmp消息的校验和:

char sbuf[] = "        This is a test message..";
sbuf[0] = 0x10;
sbuf[1] = 0x00;
sbuf[2] = 0x00;
sbuf[3] = 0x00;
sbuf[4] = 0x00;
sbuf[5] = 0x00;
sbuf[6] = 0x00;
sbuf[7] = 0x00;
for (int i = 0; i < sizeof(sbuf); i += 2)
    checksum += (sbuf[i] << 8) + sbuf[i + 1];

if (sizeof(sbuf) % 2)
    checksum += sbuf[sizeof(sbuf) - 1] << 8;
checksum = (checksum >> 16) + (checksum & 0xffff);
checksum = ~(checksum + (checksum >> 16));
sbuf[2] = checksum >> 8;
sbuf[3] = checksum & 0x00ff;


问题是,当消息长度为奇数时,计算出的校验和不正确。
checksum += sbuf[sizeof(sbuf) - 1] << 8;部分有问题,但是我不知道是什么

我该如何解决?

谢谢

最佳答案

所以我想我已经找到了这种选择。

for (int i = 0; i < sizeof(sbuf) - 1; i += 2)
    checksum += (sbuf[i] << 8) + sbuf[i + 1];

if (sizeof(sbuf) % 2)
    checksum += sbuf[sizeof(sbuf) - 1];


现在,这可以为任何长度的消息计算正确的校验和。但是我无法确认这是否是真正的解决方案,或者它只能工作,因为我消息的最后一个字节始终为零。

关于c++ - 计算ICMP数据包校验和,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20428578/

10-11 06:45