1

在不复制这里的所有源代码的情况下,我pcap_callbackpcap_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值始终返回为零。如果需要更多信息,请告诉我。

这是在运行 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 并且问题消失了。

4

1 回答 1

0

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

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

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

于 2011-10-19T08:12:18.127 回答