因为我想用libpcap和一个小C程序进行一些测试,我试图将一个结构从main()传递给got_packet()。阅读libpcap教程后,我发现了这个:
pcap_loop()的原型是 下面:
int pcap_loop(pcap_t *p, int cnt, pcap_handler callback, u_char *user)
最后一个参数在某些方面很有用 应用程序,但很多时候很简单 设为NULL。假设我们有争论 我们希望发送给我们的 回调函数,除了 pcap_loop()发送的参数。这个 是我们这样做的地方。显然,你必须 类型转换为u_char指针以确保 结果使它正确; 正如我们稍后将看到的,pcap可以使用 一些非常有趣的手段 以a的形式传递信息 u_char指针。
因此,根据这个,可以使用pcap_loop()的参数编号4在got_packet()中发送结构。但在尝试之后,我收到了一个错误。
这是我的(有问题的)代码:
int main(int argc, char **argv)
{
/* some line of code, not important */
/* def. of the structure: */
typedef struct _configuration Configuration;
struct _configuration {
int id;
char title[255];
};
/* init. of the structure: */
Configuration conf[2] = {
{0, "foo"},
{1, "bar"}};
/* use pcap_loop with got_packet callback: */
pcap_loop(handle, num_packets, got_packet, &conf);
}
void got_packet(u_char *args, const struct pcap_pkthdr *header, const u_char *packet)
{
/* this line don't work: */
printf("test: %d\n", *args[0]->id);
}
经过一些测试后,我遇到了这种错误:
gcc -c got_packet.c -o got_packet.o
got_packet.c: In function ‘got_packet’:
got_packet.c:25: error: invalid type argument of ‘->’
您是否看到我如何编辑此代码以便在got_packet()函数中传递 conf (带有一个配置结构数组)?
非常感谢您的帮助。
此致
答案 0 :(得分:4)
我重写了你的代码,它现在编译没有任何错误:
#include <pcap.h>
typedef struct {
int id;
char title[255];
} Configuration;
void got_packet( Configuration args[], const struct pcap_pkthdr *header, const u_char *packet){
(void)header, (void)packet;
printf("test: %d\n", args[0].id);
}
int main(void){
Configuration conf[2] = {
{0, "foo"},
{1, "bar"}};
pcap_loop(NULL, 0, (pcap_handler)got_packet, (u_char*)conf);
}
答案 1 :(得分:2)
你需要在main()之外定义结构并在got_packet()中强制转换 args ,如:
Configuration *conf = (Configuration *) args;
printf ("test: %d\n", conf[0].id);
答案 2 :(得分:1)
编译上面的代码。
安装libpcap - &gt; sudo apt-get install libpcap0.8-dev
然后 - &gt; gcc got_packet.c -lpcap -o got_packet.o