如何使用包含好的 pcap 结构
How to use pcap structures with the good includes
从昨天开始,我正在学习如何使用 pcap 来解析 pcap 文件。
从昨天开始我收到一个错误:
这是我的简单代码,尝试将 fd 写入 pcap_t 结构:
#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
我看到了这个post:Pcap Incomplete Type
那个家伙遇到的问题和我几乎一样,但我仍然找不到解决方案,我包括了 pcap_open_offline 需要的东西,我还包括了 pcap-bpf.h 因为我看到 pcap_t 正在使用 bpf_program.
第一个答案是 "The error is because the compiler cannot see the definition of the structure" 但在我的例子中,结构是 pcap_t 并且是 pcap.h 中的 typedef,我包括了它。
我只是不知道如何使用 pcap 包含正确的内容。
另外,我在 Ubuntu,但我找不到所有关于 pcap 的 .h 文件。当我查看 google 时,我只找到来自 apple 的 .h 和 windows,所以我假设我使用的是与 apple 相同的文件,但我不确定!
我正在阅读此文档以查看结构字段:
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 似乎不存在于我的系统中。
谢谢!
For instance, pcap-int.h doesn't seem to exist in my system.
这是不应该的。它是 pcap 源代码的一部分,但它是 libpcap 的内部,并且它定义的数据结构会随着 cap 版本的不同而发生变化,因此您不能在 pcap 程序中使用它们。
您很少需要与 pcap_t
关联的文件描述符,但是,在极少数情况下,您可以使用 pcap_fileno()
函数获得它:
printf("fd=%d\n", pcap_fileno(result));
但是,当您使用 pcap_open_offline()
打开捕获文件而不是打开设备进行实时捕获时,是 没有与之关联的文件描述符,只有 "standard 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"。
The first answer is saying "The error is because the compiler cannot see the definition of the structure" but in my case the structure is pcap_t and is typedef in pcap.h, which i included.
它在 pcap.h
中被类型定义为结构,但该结构在 pcap.h
中未完全 定义。 C 允许指向未完全定义的结构的指针;这允许库为只有库本身可以查看或修改的数据结构提供 "handle"。 pcap_t
结构就是这种情况; libpcap 之外的代码应该不 查看或修改它,它应该调用 libpcap 例程来执行此操作。
Also, I'm on Ubuntu, and i cannot find all my .h file about cap.
您可能需要安装 "libpcap-dev" 软件包。 "libpcap" 包只安装了足够的库来允许已经用 libpcap 编译的程序到 运行; "libpcap-dev" 软件包安装头文件以允许使用 libpcap 编译程序。
When I look on google, I only find .h from apple and windows
没有找到 the GitHub repository for libpcap?真是令人惊讶。
so I assume that i'm using the same as the apple one
Apple 的 libpcap 基于 the Tcpdump Group 中的那个,也就是 GitHub 上的那个。 Ubuntu 中的那个也是基于 Tcpdump Group 的那个,WinPcap 也是如此,它是 Windows.
的版本
从昨天开始,我正在学习如何使用 pcap 来解析 pcap 文件。
从昨天开始我收到一个错误:
这是我的简单代码,尝试将 fd 写入 pcap_t 结构:
#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
我看到了这个post:Pcap Incomplete Type
那个家伙遇到的问题和我几乎一样,但我仍然找不到解决方案,我包括了 pcap_open_offline 需要的东西,我还包括了 pcap-bpf.h 因为我看到 pcap_t 正在使用 bpf_program.
第一个答案是 "The error is because the compiler cannot see the definition of the structure" 但在我的例子中,结构是 pcap_t 并且是 pcap.h 中的 typedef,我包括了它。
我只是不知道如何使用 pcap 包含正确的内容。
另外,我在 Ubuntu,但我找不到所有关于 pcap 的 .h 文件。当我查看 google 时,我只找到来自 apple 的 .h 和 windows,所以我假设我使用的是与 apple 相同的文件,但我不确定!
我正在阅读此文档以查看结构字段: 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 似乎不存在于我的系统中。
谢谢!
For instance, pcap-int.h doesn't seem to exist in my system.
这是不应该的。它是 pcap 源代码的一部分,但它是 libpcap 的内部,并且它定义的数据结构会随着 cap 版本的不同而发生变化,因此您不能在 pcap 程序中使用它们。
您很少需要与 pcap_t
关联的文件描述符,但是,在极少数情况下,您可以使用 pcap_fileno()
函数获得它:
printf("fd=%d\n", pcap_fileno(result));
但是,当您使用 pcap_open_offline()
打开捕获文件而不是打开设备进行实时捕获时,是 没有与之关联的文件描述符,只有 "standard 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"。
The first answer is saying "The error is because the compiler cannot see the definition of the structure" but in my case the structure is pcap_t and is typedef in pcap.h, which i included.
它在 pcap.h
中被类型定义为结构,但该结构在 pcap.h
中未完全 定义。 C 允许指向未完全定义的结构的指针;这允许库为只有库本身可以查看或修改的数据结构提供 "handle"。 pcap_t
结构就是这种情况; libpcap 之外的代码应该不 查看或修改它,它应该调用 libpcap 例程来执行此操作。
Also, I'm on Ubuntu, and i cannot find all my .h file about cap.
您可能需要安装 "libpcap-dev" 软件包。 "libpcap" 包只安装了足够的库来允许已经用 libpcap 编译的程序到 运行; "libpcap-dev" 软件包安装头文件以允许使用 libpcap 编译程序。
When I look on google, I only find .h from apple and windows
没有找到 the GitHub repository for libpcap?真是令人惊讶。
so I assume that i'm using the same as the apple one
Apple 的 libpcap 基于 the Tcpdump Group 中的那个,也就是 GitHub 上的那个。 Ubuntu 中的那个也是基于 Tcpdump Group 的那个,WinPcap 也是如此,它是 Windows.
的版本