указатель разыменования на неполный тип с помощью struct ip, а также с помощью struct iphdr

#c #linux #pointers #raw-sockets

#c #linux #указатели #необработанные сокеты

Вопрос:

здравствуйте, я пытаюсь проанализировать некоторые пакеты, и при использовании struct ip я получаю сообщение об ошибке: «указатель разыменования на неполный тип». Итак, я попробовал тогда с struct iphdr, но все еще сталкиваюсь с той же проблемой, вот функция, которую я использую для синтаксического анализа пакета:

 PrintPacketInHex(char *mesg, unsigned char *p, int len){
printf(mesg);
while(len--){
printf("%.2X ",*p);
p  ;
}
}


/*parse the sniffed packets*/

ParseEthernetHeader(unsigned char *packet, int len){
struct ethhdr *ethernet_header;
struct ip *ip_header;
// sizeof(struct iphdr)
if(len> sizeof(struct ethhdr)){
ethernet_header = (struct ethhdr*) packet;
packet = packet  16;
ip_header = (struct ip*) packet;

/* first set of 6 bytes are destination MAC*/

PrintPacketInHex("destination MAC : ", ethernet_header->h_dest,6);
printf("n");

/*scond set of 6 bytes are source MAC */

PrintPacketInHex("source MAC : ", ethernet_header->h_source,6);
printf("n");

/*last 2 bytes in ethernet header are the protocol in carries */

PrintPacketInHex("protocol: ", (void*)amp;ethernet_header->h_proto,2);
printf("n");

/*the next 4 bytes are ip version bytes */

PrintPacketInHex("ip version: ", ip_header->ip_v,4);
printf("n");

/*the next 4 bytes are internet header length */

PrintPacketInHex("internet header length: ", ip_header->ip_ihl,4);
printf("n");

/*the next 8 bytes are type of srvice bytes */

PrintPacketInHex("type of service: ", ip_header->ip_tos,8);
printf("n");

/*the next 8 bytes are total length bytes */

PrintPacketInHex("total length: ", ip_header->ip_len,16);
printf("n");

/*the next 8 bytes are identification bytes */

PrintPacketInHex("identification: ", ip_header->ip_id,16);
printf("n");

/*the next 8 bytes are flags bytes 

PrintPacketInHex("Flags: ", "flags",3);
printf("n");*/

/*the next 13 bytes flags and offset bytes */

PrintPacketInHex("offset: ", ip_header->ip_off,16);
printf("n");

/*the next 8 bytes time to live bytes */
PrintPacketInHex("time to live: ", ip_header->ip_ttl,8);
printf("n");

/*the next 8 bytes protocol bytes */

PrintPacketInHex("protocol: ", ip_header->ip_p,8);
printf("n");

/*the next 16 bytes are checksum bytes */

PrintPacketInHex("checksum: ", ip_header->ip_sum,16);
printf("n");

/*the next 32 bytes source ip adress bytes */

PrintPacketInHex("source ip: ", ip_header->ip_src,32);
printf("n");

/*the next 32 bytes destination ip adress bytes */

PrintPacketInHex("destination ip: ", ip_header->dip_dst,32);
printf("n");
}
else printf("packet size too small ! n");
}
 

я знаю, что в программе есть и другие ошибки, но хочу решить эту проблему, прежде чем искать другие проблемы.
Спасибо

Комментарии:

1. Включили ли вы заголовочный файл , который определяет структуру ip ?

2. Где struct ip определено?

Ответ №1:

Ваш модуль компиляции должен включать определения struct ethhdr и struct ip , чтобы вы могли получить доступ к их элементам.

Комментарии:

1. спасибо, это была моя глупая ошибка: D, я забыл включить netinet.h