Изменения значения структуры после перехода к методу - PullRequest
2 голосов
/ 20 июля 2011

Я пишу синтаксический анализатор пакетов с использованием libpcap и сталкиваюсь со странным поведением при попытке прочитать длину пакета из заголовка pcap.

Первый оператор printf, приведенный ниже, выводит правильную длину пакета, тогда как второй оператор выводит число, например 362791.

struct pcap_pkthdr header;
pcap_t *handle;
const u_char *packet;

...

    while((packet = pcap_next(handle, &header)) != NULL) {
        printf("[%d]\n", header.len);   
        process_packet(&header, packet);
    }

...
}

void process_packet(struct pcap_pkthdr *header, const u_char *packet) {
    printf("[%d] %d bytes\n", header->ts, header->len);
}

Определение struct pcap_pkthdr:

struct pcap_pkthdr {
    struct timeval ts; /* time stamp */
    bpf_u_int32 caplen; /* length of portion present */
    bpf_u_int32 len; /* length this packet (off wire) */
};

Прототипом для pcap_next является u_char *pcap_next(pcap_t *p, struct pcap_pkthdr *h)

Есть ли причина, по которой это происходит?

Ответы [ 3 ]

3 голосов
/ 20 июля 2011

Я думаю, что корень проблемы в том, что в коде

printf("[%d] %d bytes\n", header->ts, header->len);

секция данных ts, тип которой struct timeval, не просто простые целочисленные данные илиминимум sizeof (timeval) не совпадает с sizeof (int).Это приведет к тому, что printf использует неправильное смещение адреса при попытке извлечь второй параметр в списке аргументов var.

Так что я думаю, printf("[%d] %d bytes\n", header->len, header->ts ); должно работать правильно, но вы не можете просто поменять их.

0 голосов
/ 20 июля 2011

... вы сравниваете яблоки с апельсинами?

/* header.len in brackets */
printf("[%d]\n", header.len); 

/* header->ts in brackets */
printf("[%d] %d bytes\n", header->ts, header->len);
0 голосов
/ 20 июля 2011

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

Единственное, что сейчас приходит на ум, - это то, что что-то работает одновременно в фоновом режиме и хлопает вашей структурой.Я не очень разбираюсь в pcap, поэтому не могу помочь вам со спецификой ...

НО, когда у меня есть такие странности, я обычно создаю функцию статистики, которая выводит все мыслимые вещи оструктура ... и вызывать функцию статистики везде ... это похоже на мини-встроенный модульный тест.

Я бы хотел, чтобы вы обновили свой код и попробовали его:

void hdr_stats(struct pcap_pkthdr *header){
    unsigned int i;
    printf("address of header:  %p\n", header);

    printf("caplen:             %d\n", header->caplen);
    i = header->caplen;
    printf("caplen:             %d\n", i);

    printf("len:                %d\n", header->len);
    i = header->len;
    printf("len:                %d\n", i);

    //-------
    // add header->ts.xxxx debugging here, might give other clues...
    //-------
}

...

    while((packet = pcap_next(handle, &header)) != NULL) {
        printf("[%d]\n", header.len);   
        hdr_stats(&header);
        process_packet(&header, packet);
        hdr_stats(&header);
    }

...

void process_packet(struct pcap_pkthdr *header, const u_char *packet) {
    hdr_stats(header);
    printf("[%d]\n", header->len);
    hdr_stats(header);
}

это может помочь вам исправить ошибку.

...