【发布时间】:2014-04-25 01:33:15
【问题描述】:
我在 x64 机器上。以下是我计算 ICMP 校验和的方法:
unsigned short in_checksum(unsigned short *ptr, int n_bytes)
{
register long sum;
u_short odd_byte;
register u_short ret_checksum;
while (n_bytes > 1)
{
sum += *ptr++;
n_bytes -= 2;
}
if (n_bytes == 1)
{
odd_byte = 0;
*((u_char *) & odd_byte) = * (u_char *) ptr;
sum += odd_byte;
}
sum = (sum >> 16) + (sum & 0xffff);
sum += (sum >> 16);
ret_checksum = ~sum;
return ret_checksum;
}
当我通过wireshark嗅探发送的数据包时,我总是说每个icmp数据包的校验和都不正确。这是怎么回事?
【问题讨论】:
-
我的 ping 检查实施 - 不确定这是否可以帮助您 github.com/petrbel/pvu2/blob/master/ping/ping.c#L50
标签: c linux networking 64-bit raw-sockets