取消引用指向 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 平台相关和设备相关的字段。)
我正在用 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 平台相关和设备相关的字段。)