【问题标题】:How to use pcap structures with the good includes如何使用包含好的 pcap 结构
【发布时间】:2015-10-21 11:52:20
【问题描述】:

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

另外,我在 Ubuntu 上,我找不到所有关于 pcap 的 .h 文件。当我在谷歌上查看时,我只能从苹果和 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。

谢谢!

【问题讨论】:

    标签: c pcap libpcap


    【解决方案1】:

    例如,我的系统中似乎不存在 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 上,我找不到所有关于 cap 的 .h 文件。

    您可能需要安装“libpcap-dev”软件包。 “libpcap”包只安装了足够的库来允许已经用 libpcap 编译的程序运行; "libpcap-dev" 软件包安装头文件以允许使用 libpcap 编译程序。

    当我在谷歌上查找时,我只能从 apple 和 windows 中找到 .h

    没有找到the GitHub repository for libpcap?这很令人惊讶。

    所以我假设我使用的是和苹果一样的

    Apple 的 libpcap 基于来自 the Tcpdump Group 的那个,它是 GitHub 上的那个。 Ubuntu 中的版本也是基于 Tcpdump Group 中的版本,WinPcap 也是基于 Windows 的版本。

    【讨论】:

    • 谢谢你,这是我需要了解的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-21
    • 1970-01-01
    • 2011-10-17
    • 1970-01-01
    相关资源
    最近更新 更多