Если я распечатываю значения полей заголовка IP-заголовка, отправленного в сокет RAW со следующими параметрами и настройками по умолчанию, я вижу, что номер протокола установлен в «2», что соответствует IGMP.
sock = socket(PF_INET, SOCK_RAW, AF_INET);
Однако, если я получаю доступ к пакету с помощью заголовка TCP, я получаю хорошие значения для большинства полей, за исключением того, что смещение данных получает неправильное значение.Кроме того, я не могу правильно прочитать заголовок с помощью заголовков IGMP на платформе Linux (Ubuntu).
Для чтения заголовка:
printf("\n");
printf("IP Header\n");
printf(" |-IP Version : %d\n",(unsigned int)iph->version);
printf(" |-IP Header Length : %d DWORDS or %d Bytes\n",(unsigned int)iph->ihl, ((unsigned int)(iph->ihl))*4);
printf(" |-Type Of Service : %d\n",(unsigned int)iph->tos);
printf(" |-IP Total Length : %d Bytes(Size of Packet)\n",ntohs(iph->tot_len));
printf(" |-Identification : %d\n",ntohs(iph->id));
printf(" |-TTL : %d\n",(unsigned int)iph->ttl);
printf(" |-Protocol : %d\n",(unsigned int)iph->protocol);
printf(" |-Checksum : %d\n",ntohs(iph->check));
printf(" |-Source IP : %s\n",inet_ntoa(source.sin_addr));
printf(" |-Destination IP : %s\n",inet_ntoa(dest.sin_addr));
// IGMP Print
printf("\n");
printf("IGMP Header\n");
printf(" |-IGMP Type : %d\n",(unsigned int)head->igmp_type);
printf(" |-IGMP Code : %d\n",(unsigned int)head->igmp_code);
printf(" |-IGMP Checksum : %d\n",(unsigned int)head->igmp_cksum);
printf(" |-IGMP Address : %s\n",inet_ntoa(head->igmp_group.sin_addr);
Это вызывает ошибку для пакета IGMP:
error: dereferencing pointer to incomplete type
Для всех 4 полей.
Если я воспринимаю его как заголовок TCP, он работает нормально.
Я использую сокет RAW для связи между демоном иCLI в качестве агента управления.