struct pcap_pkthdr len всегда == ноль - PullRequest
       5

struct pcap_pkthdr len всегда == ноль

1 голос
/ 20 сентября 2011

Не копируя весь источник здесь, я нажимаю на pcap_callback функцию из pcap_dispatch.caplen, кажется, показывает правильную длину (при том, что это всегда что-то), но len всегда равен 0. Разве это поле больше не заполнено?Может быть, это ошибка, которую я не фиксирую?

Вот фрагмент ...

void myCallback ( const struct pcap_pkthdr *header, const u_char *packet, void* buffer )
{
   if ( (uint16_t)(header->len) != (uint16_t)(header->caplen) )
       /* Some Error */
        streamObj << "Caplen (" <<  (uint16_t)(header->caplen) <<  " != "
        << ") Packet Len (" << (uint16_t)(header->len) << ")";
   ...
}

Значение header->len всегда возвращается как ноль.Если требуется дополнительная информация, просто дайте мне знать.

Это было найдено на сервере SUSE Linux 11SP1 под управлением libpcap.so.0.9.8 с ядром 2.6.32.Эта проблема возникает только после обновления SUSE Linux 10SP3 с помощью libpcap.so.0.9.3.

EDIT: Это, похоже, проблема только с libpcap.so.0.9.8.Я переназначил ссылку в / usr / lib / на использование libpcap.so.0.9.3 и проблема исчезла.

1 Ответ

0 голосов
/ 19 октября 2011

Три аргумента для функции обратного вызова для pcap_dispatch(), в следующем порядке:

  1. Указатель «пользовательских данных» передан в pcap_dispatch();
  2. Указатель на struct pcap_pkthdr;
  3. Указатель на необработанные пакетные данные.

Следовательно, myCallback не является допустимой функцией обратного вызова и не может быть передан в pcap_dispatch (), так как он ожидает, что первый аргумент будет указателем на struct pcap_pkthdr. Если у вас нет другой функции, которая является реальным обратным вызовом, которая затем вызывает myCallback с соответствующими аргументами, рассматриваемый код не будет работать и должен по крайней мере получить предупреждение от компилятора C или C ++.

...