从昨天开始,我正在学习如何使用pcap来解析pcap文件。
从昨天起我就出现了错误:
这是我的简单代码,尝试在pcap_t结构中编写fd:
#include <pcap/pcap.h>
#include <sys/types.h>
#include <pcap-bpf.h>
#include <stdio.h>
int main() {
char errbuf[PCAP_ERRBUF_SIZE];
pcap_t *result;
if ((result = pcap_open_offline("test.pcap", errbuf)) == NULL) {
printf("%s\n", errbuf);
return -1;
}
printf("fd=%d\n", result->fd);
return 0;
}
这是我的错误:
gcc -Wextra -Wall -Werror -I./includes -c -o main.o main.c
main.c: In function ‘main’:
main.c:14:27: error: dereferencing pointer to incomplete type
printf("fd=%d\n", result->fd);
^
make: *** [main.o] Error 1
我看过这篇文章:Pcap Incomplete Type
那家伙遇到的问题几乎和我一样,但是,我找不到解决方案,我包含了pcap_open_offline需要的东西,我还包括pcap-bpf.h因为我看到pcap_t正在使用bpf_program。
第一个答案是说“错误是因为编译器无法看到结构的定义”,但在我的例子中,结构是pcap_t,并且是pcap.h中的typedef,我包含了它。
我只是不知道如何在pcap中包含correclty。
另外,我在Ubuntu上,我找不到关于pcap的所有.h文件。当我在google上看时,我只能从苹果和Windows中找到.h,所以我认为我使用的是苹果和苹果一样的,但我不确定!
我正在阅读此文档以查看结构字段: http://www.opensource.apple.com/source/libpcap/libpcap-18/libpcap/pcap.h http://www.opensource.apple.com/source/libpcap/libpcap-9/libpcap/pcap-int.h
但是再一次,apple.com吓到了我,我不确定我应该依赖它。例如,我的系统中似乎不存在pcap-int.h。
谢谢!
答案 0 :(得分:2)
例如,我的系统中似乎不存在pcap-int.h。
不应该这样。它是pcap源代码的一部分,但它是libpcap的内部,它定义的数据结构可能会从cap发行版更改为发行版,因此你不能在pcap程序中使用它们。
您很少需要与pcap_t
关联的文件描述符,但是,在您执行的极少数情况下,您可以使用pcap_fileno()
函数获取它:
printf("fd=%d\n", pcap_fileno(result));
然而,当您使用pcap_open_offline()
打开捕获文件,而不是打开设备进行实时捕获时, 没有与之关联的文件描述符它,只有一个“标准I / O”FILE *
。正如pcap_fileno()
的手册页所说:
If p refers to a ``savefile'' that was opened using functions such as
pcap_open_offline() or pcap_fopen_offline(), a ``dead'' pcap_t opened
using pcap_open_dead(), or a pcap_t that was created with pcap_create()
but that has not yet been activated with pcap_activate(), it returns
-1.
所以它应该在程序中打印“fd = -1”。
第一个答案是说“错误是因为编译器无法看到结构的定义”,但在我的例子中,结构是pcap_t,并且是pcap.h中的typedef,我包含了它。
它的类型被定义为pcap.h
中的结构,但该结构在pcap.h
中未完全定义。 C允许指向未完全定义的结构的指针;这允许库为数据结构提供“句柄”,只有库本身可以查看或修改。 pcap_t
结构就是这种情况; libpcap外部的代码应该不查看或修改它,它应该调用libpcap例程来做到这一点。
另外,我在Ubuntu上,我找不到关于上限的所有.h文件。
您可能需要安装“libpcap-dev”软件包。 “libpcap”包只安装了足够的库来允许已经用libpcap编译的程序运行; “libpcap-dev”包安装头文件以允许用libpcap编译程序。
当我查看谷歌时,我只能从苹果和Windows中找到.h
找不到the GitHub repository for libpcap?这令人惊讶。
所以我假设我和苹果一样使用
Apple的libpcap基于the Tcpdump Group中的一个,这是GitHub上的一个。 Ubuntu中的那个也是基于Tcpdump Group的那个,WinPcap是Windows的版本。