如何使用包含好的 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.

的版本