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

时间:2016-04-06 13:28:08

标签: c struct libpcap

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

$dbc = mysqli_connect(DBHOST,DBUSER,DBPW);
if (!$dbc) {
die("Database connection failed: " . mysqli_error($dbc));
exit();
}

$dbs = mysqli_select_db($dbc, DBNAME);
if (!$dbs) {
die("Database selection failed: " . mysqli_error($dbc));
exit(); 
}
mysqli_set_charset($dbc, 'utf8');

$reportdata = mysqli_real_escape_string($dbc, $_GET['reportdata']);

$query = "INSERT INTO `onwordreports`(`reportdata`) VALUES ('$reportdata')";

$result = mysqli_query($dbc, $query or trigger_error("Veri yükleme başarısız: " . mysqli_error($dbc)));

echo $result;

mysqli_close($dbc);

最小代码如下:

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);
}

根据http://www.opensource.apple.com/source/libpcap/libpcap-9/libpcap/pcap-int.h,pcap_t结构确实有这个字段。 通常包含libpcap,所以我根本不理解。

谢谢!

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

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

问题解决了,谢谢你的帮助!

2 个答案:

答案 0 :(得分:1)

pcap-int.h中的 -int 代表internal。但是,您的代码中不包含此标题。

请注意pcap.h本身不包含此标头,也不包含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);
}

唉,似乎这个内部标头没有安装在Linux上,也没有安装在Mac上。对于一个非常丑陋的黑客攻击,您可以尝试从链接中复制pcap-int.h

答案 1 :(得分:0)

嗯,你可以做,

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() / { {1}} / poll() / kqueues /等。在那个描述符上。在较新版本的BSD风格的操作系统(包括OS X)上,可以在普通网络接口的描述符上执行此操作,但在某些旧版本的BSD风格的操作系统上不能这样做,并且你必须解决其他旧版BSD风格操作系统的问题(详见the man page for pcap_get_selectable_fd()),而你也不能在Endace DAG卡等专用设备上这样做。

因此,在某些情况下,epoll()会返回-1,这意味着“ 没有FD,您可以为此pcap_get_selectable_fd()等进行此操作select() 1}}”。

(并且,是的,故意是pcap_t未安装且pcap-int.h未声明pcap.h的成员;该结构的内容可能会发生变化从发布版本到发布版本,更新的libpcap发行版已从该结构中删除了与平台相关且依赖于设备的字段的 lot 。)