取消引用指向 pcap_t 结构的不完整类型的指针

dereferencing pointer to incomplete type for pcap_t structure

我正在用 C 编写代码并使用 libpcap 库。 我想查看 pcap_t 结构的字段,但总是有错误:

error: dereferencing pointer to incomplete type

最小代码如下:

#include <stdio.h>
#include <pcap/pcap.h>

int main()
{
    char errbuf[PCAP_ERRBUF_SIZE];
    pcap_t *handle;
    handle=pcap_open_live("eth0", 65535, 1, 1, errbuf);

    printf("Handle%d\n", handle->fd);

    pcap_close(handle);
}

编译完成:

gcc test.c -lpcap

根据http://www.opensource.apple.com/source/libpcap/libpcap-9/libpcap/pcap-int.h,pcap_t结构确实有这个字段。 libpcap一般都是包含的,所以我完全不明白。

谢谢!

结论: Olaf 似乎是对的:我有这个错误是因为我无法访问 pcap_t 结构。 正如 Antti Haapala 所说,pcap_t 结构未在 pcap/pcap.h 中定义,而是在另一个文件中定义。

我确实设法做了我想做的事,即使没有访问结构的字段。

问题已解决,感谢您的帮助!

-int pcap-int.h stands for internal。但是,您没有在代码中包含此 header。

请注意 pcap.h 本身不包含此 header,也不包含 struct pcap 的完整声明;而只是使用 typedef 中的前向声明:

typedef struct pcap pcap_t;

试一试:

#include <stdio.h>
#include <pcap/pcap-int.h>
#include <pcap/pcap.h>

int main()
{
    char errbuf[PCAP_ERRBUF_SIZE];
    pcap_t *handle;
    handle=pcap_open_live("eth0", 65535, 1, 1, errbuf);

    printf("Handle%d\n", handle->fd);

    pcap_close(handle);
}

唉,这个内部 header 似乎没有安装在 Linux 和 Mac 中。对于 extra-ugly hack,您可以尝试从 link.

复制 pcap-int.h

好吧,你也可以这样做

printf("Handle%d\n", pcap_fileno(handle));

如果您使用select()/poll()/epoll()/kqueues/etc。在有问题的描述符上,或

if (pcap_get_selectable_fd(handle) != -1)
    printf("Handle%d\n", pcap_get_selectable_fd(handle));

如果您打算使用select()/poll()/epoll()/kqueues/etc。在有问题的描述符上。

不同之处在于,至少目前,在 UN*Xes 上总会有一个 pcap_t 的文件描述符,但不能保证您一定能够使用 select() /poll()/epoll()/kqueues/etc。在那个描述符上。在较新版本的 BSD 风格 OSes(包括 OS X)上,您 可以 对普通网络接口的描述符执行此操作,但您不能这样做所以在一些旧版本的 BSD 风格 OSes 上,你必须解决其他旧版本 BSD 风格的 OSes 的问题(详见 the man page for pcap_get_selectable_fd()),并且您也不能在某些专用设备上这样做,例如 Endace DAG 卡。

所以,在某些情况下,pcap_get_selectable_fd() returns -1,也就是"there is no FD on which you can do select(), etc., for this pcap_t".

(而且,是的,未安装 pcap-int.h 并且 pcap.h 未声明 [​​=28=] 的成员是有意的;该结构的内容受从一个版本到另一个版本的变化,较新的 libpcap 版本已经从该结构中删除了 lot 平台相关和设备相关的字段。)