Неполный тип Pcap

Я пытаюсь найти MAC-адрес, используя pcap для небольшого проекта. На данный момент структура, с которой я работаю, выглядит так:

    struct ethernet_header
    {
         u_char dhost[6];
         u_char shost[6];
         u_short type;
    };

Вызов кода выглядит просто так:

    void get_packet(u_char *args, const struct pcap_pkthdr *header, const u_char *packet)
    {
         const struct ethernet_header *ethernet;
         const struct ip_header *ip;
         ethernet = (struct ethernet_header *)(packet);
         ip = (struct ip_header *)(packet + 16);

         printf("Destination MAC: %s\n", ethernet->dhost);
    }

Ошибка, которую я получаю,

error: dereferencing pointer to incomplete type

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


person Blackninja543    schedule 16.03.2012    source источник
comment
@nos Структура определена в том же файле, в котором она вызывается. то же самое касается и ip_header, который работает.   -  person Blackninja543    schedule 16.03.2012
comment
@nos Оказывается, gcc решил не предупреждать меня о неизвестном типе данных во время компиляции. Ошибка инициализации, спасибо за помощь.   -  person Blackninja543    schedule 16.03.2012


Ответы (2)


ошибка: разыменование указателя на неполный тип

Вы пропустили включение файла заголовка, который определяет struct ethernet_header, в файл c, который имеет функцию void get_packet().

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

Так что просто включите его. Вам нужно включить файл заголовка, который содержит определение структуры в этом конкретном файле c.

person Alok Save    schedule 16.03.2012
comment
Это быстрая программа, поэтому я не стал создавать файлы заголовков, это просто структура, определенная в верхней части main.c. То же самое касается IP_header, который работает. - person Blackninja543; 16.03.2012
comment
@ Blackninja543: Как я уже упоминал в ответе, проблема в том, что компилятор не может видеть определение структуры, когда вы разыменовываете указатель на нее внутри функции. Ищите ошибки, опечатки на этой основе. - person Alok Save; 16.03.2012
comment
Что ж, это было глупо... похоже, я пропустил начальное объявление, и компилятор решил не предупреждать меня о неизвестном типе объявления... Спасибо за помощь - person Blackninja543; 16.03.2012

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

ethernet = (struct ethernet_header *)(packet);
ip = (struct ip_header *)(packet + 16);
person Rahul Raina    schedule 14.05.2015