如何使用pcap结构与良好的包括

时间:2015-10-21 11:52:21

标签: c pcap libpcap

从昨天开始,我正在学习如何使用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。

谢谢!

1 个答案:

答案 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的版本。