сокет (PF_INET, SOCK_RAW, AF_INET) использует IGMP? - PullRequest
1 голос
/ 20 января 2012

Если я распечатываю значения полей заголовка 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 в качестве агента управления.

1 Ответ

1 голос
/ 20 января 2012

Я думаю, вы серьезно не поняли, для чего нужны необработанные сокеты.Это инструмент, позволяющий вам вручную собирать или проверять содержимое IP-пакетов, включая заголовки более высокого уровня внутри IP-пакета, которые сообщают, являются ли они TCP, UDP, ICMP, IGMP и т. Д. Они не являются средствомсвязи для непосредственного использования, но средство для взлома существующих высокоуровневых средств связи более низкого уровня.

Для вашего приложения вам почти наверняка нужны сокеты TCP или UDP.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...