为什么这个位移有效?

时间:2018-05-13 20:59:52

标签: c networking ip

我正在尝试发送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标头的标志字段时没有。

任何人都能解释一下吗?

0 个答案:

没有答案