我正在尝试发送ICMP数据包,因此我编写了以下代码:
IP *construct_ip_hdr(struct sockaddr_in *src, struct sockaddr_in *dst)
{
IP *iph = malloc(sizeof(IP));
if (!iph)
{
perror("malloc");
return NULL;
}
memset(iph, 0, sizeof(IP));
iph->version |= IP_VERSION;
iph->version |= DEFAULT_IHL;
iph->tos = TOS;
iph->tot_len = htons(DEFAULT_TOTAL_LEN + ICMP_SIZE);
iph->id = htons(ID);
iph->frag_off |= (1 << 14);
iph->ttl = DEFAULT_TTL;
iph->proto = DEFAULT_PROTO;
iph->src = src->sin_addr.s_addr;
iph->dst = dst->sin_addr.s_addr;
iph->chksum = htons(calculate_ip_chksum(iph));
return iph;
}
我尝试发送数据包,但是没有成功。我在Wireshark中检查了数据包。它显示IP报头的标志字段(我与片段偏移字段结合)完全归零。后来,我写了一个错误,用1 << 14
替换了2 << 6
。当我检查Wireshark发送的数据包时,它显示我已正确发送了ICMP数据包。但是,我不明白为什么2 << 6
有效以及为什么1 << 14
在设置IP标头的标志字段时没有。
任何人都能解释一下吗?