2014-04-25 134 views
0

我在x64机器上。这里是我是如何计算校验和ICMP: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包。这是怎么回事?

+0

我的ping检查实现 - 不确定是否可以帮助你https://github.com/petrbel/pvu2/blob/master/ping/ping.c#L50 – petrbel

回答

1

你忘了初始化

register long sum; 

0传递选项-W到GCC会告诉你的。

 
...: In function 'in_checksum': 
...: warning: 'sum' may be used uninitialized in this function