在不复制此处所有源代码的情况下,我从 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()
回调函数的三个参数按顺序是:
- 传递给
pcap_dispatch()
的“用户数据”指针; - 一个指向
struct pcap_pkthdr
的指针; - 指向原始数据包数据的指针。
因此,myCallback
不是有效的回调函数,不能传递给 pcap_dispatch(),因为它期望第一个参数是指向 struct pcap_pkthdr
的指针.除非你有另一个真正的回调函数,然后调用 myCallback
使用适当的参数,有问题的代码将无法运行,并且至少应该从 C 或 C++ 编译器获得警告。
关于c++ - struct pcap_pkthdr len 总是 == 零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7478437/