发送ICMP数据的时候要进行,ICMP报头填充:
/*设置ICMP报头*/
static void icmp_pack(struct icmp *icmph, int seq, struct timeval *tv, int length )
{
unsigned char i = 0;
/*设置报头*/
icmph->icmp_type = ICMP_ECHO; /*ICMP回显请求*/
icmph->icmp_code = 0; /*code值为0*/
icmph->icmp_cksum = 0; /*先将cksum值填写0,便于之后的cksum计算*/
icmph->icmp_seq = seq; /*本报的序列号*/
icmph->icmp_id = pid &0xffff; /*填写PID*/
for(i = 0; i< length; i++)
icmph->icmp_data[i] = i;
/*计算校验和*/
icmph->icmp_cksum = icmp_cksum((unsigned char*)icmph, length);
}
其中会进行头部字段和数据的校验(数据在内的整个ICMP包的校验):
/*设置ICMP报头*/
static void icmp_pack(struct icmp *icmph, int seq, struct timeval *tv, int length )
{
unsigned char i = 0;
/*设置报头*/
icmph->icmp_type = ICMP_ECHO; /*ICMP回显请求*/
icmph->icmp_code = 0; /*code值为0*/
icmph->icmp_cksum = 0; /*先将cksum值填写0,便于之后的cksum计算*/
icmph->icmp_seq = seq; /*本报的序列号*/
icmph->icmp_id = pid &0xffff; /*填写PID*/
for(i = 0; i< length; i++)
icmph->icmp_data[i] = i;
/*计算校验和*/
icmph->icmp_cksum = icmp_cksum((unsigned char*)icmph, length);
}