struct pcap_pkthdr len always == zero

struct pcap_pkthdr len always == zero

本文关键字:always zero len pkthdr pcap struct      更新时间:2023-10-16

不复制这里的所有源代码,我从pcap_dispatch命中pcap_callback函数。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值总是返回为零。如果需要更多的信息,请告诉我。

在运行libpcap.so.0.9.8和2.6.32内核的SUSE Linux 11SP1服务器上发现。此问题仅在使用libpcap.so.0.9.3从SUSE Linux 10SP3升级后出现。

编辑:这似乎只是libpcap.so.0.9.8的问题。我重新指向/usr/lib/中的链接,使用libpcap.so.0.9.3,问题消失了。

pcap_dispatch()回调函数的三个参数依次为:

  1. "用户数据"指针传递给pcap_dispatch();
  2. 指向struct pcap_pkthdr的指针
  3. 原始数据包数据的指针。

因此,myCallback不是一个有效的回调函数,不能传递给pcap_dispatch(),因为它期望第一个参数是指向struct pcap_pkthdr的指针。除非您有另一个函数是真正的回调,然后使用适当的参数调用myCallback,否则所讨论的代码将无法工作,并且应该至少从C或c++编译器获得警告。