在libpcap pcap_loop()回调上传递一个参数

时间:2009-11-14 15:11:22

标签: c libpcap

因为我想用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 (带有一个配置结构数组)?

非常感谢您的帮助。

此致

3 个答案:

答案 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