我在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中定义,而是在另一个文件中定义。
无论如何,我确实设法做了我想做的事,即使没有访问结构的字段。
问题解决了,谢谢你的帮助!
答案 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 。)