Почему этот бит сдвиг работает? - PullRequest
0 голосов
/ 13 мая 2018

Я пытался отправить пакет 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. Он показал, что поле flags заголовка IP (которое я объединил с полем смещения фрагмента) было полностью обнулено. Позже я сделал ошибку, написав и заменив 1 << 14 на 2 << 6. Когда я проверил пакет, отправленный в Wireshark, он показал, что я правильно отправил пакет ICMP. Однако я не понимаю, почему 2 << 6 работает и почему 1 << 14 не работает при установке поля флагов в заголовке IP.

Может кто-нибудь объяснить это?

...