struct pcap_pkthdr len总是==零

时间:2011-09-19 23:21:47

标签: c++ pcap libpcap

如果不复制此处的所有来源,我正在点击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值始终返回零。如果需要更多信息,请告诉我。

这是在运行带有2.6.32内核的libpcap.so.0.9.8的SUSE Linux 11SP1服务器上找到的。使用libpcap.so.0.9.3从SUSE Linux 10SP3升级后才会出现此问题。

编辑:     这似乎只是libpcap.so.0.9.8的一个问题。我重新命名/ usr / lib /中的链接以使用libpcap.so.0.9.3并且问题消失了。

1 个答案:

答案 0 :(得分:0)

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

  1. “用户数据”指针传递给pcap_dispatch();
  2. 指向struct pcap_pkthdr;
  3. 的指针
  4. 指向原始数据包数据的指针。
  5. 因此,myCallback不是有效的回调函数,并且不能传递给pcap_dispatch(),因为它期望第一个参数是指向struct pcap_pkthdr的指针。除非你有另一个真正的回调函数,然后使用适当的参数调用myCallback,否则有问题的代码将无法工作,并且至少应该从C或C ++编译器得到警告。