如何将多个参数传递给pcap_loop()/ pcap_handler()?

时间:2014-07-15 21:30:38

标签: c++ pcap libpcap

我需要将两个不同类型的指针传递给pcap_loop(),以便pcap_handler可以读取/修改该数据。

pcap_loop()看起来像:

int pcap_loop(pcap_t *p, int cnt, pcap_handler callback, u_char *user);

...并通过u_char * user接受参数并将这些参数传递给pcap_handler callback,如下所示:

void pcap_handler(u_char *user, const struct pcap_pkthdr *h, const u_char *bytes);

那么如何通过单个u_char指针传递多个参数?我尝试将它们作为一个u_char指针数组传递......

#include <pcap/pcap.h>

...

void callback(u_char *arg_array, const struct pcap_pkthdr *h, const u_char *bytes) {

    class1 * c1_ptr = (class1 *)arg_array[0];
    class2 * c2_ptr = (class2 *)arg_array[1];

}

void main() {

...

class1 c1;
class2 c2;
u_char * arg_array[2];

arg_array[0] = (u_char *)&c1;
arg_array[1] = (u_char *)&c2;

pcap_loop(p, cnt, callback, arg_array);

}

......但是(毫不奇怪)得到u_char * array[] - &gt; u_char *次转化错误。我也被警告过从较小的类型(u_char *)转换为更大的类型(class1 *class2 *)。

这样做的正确方法是什么?

1 个答案:

答案 0 :(得分:4)

这里的问题是你试图将一个u_char指针数组(u_char**)传递给一个需要u_char数组/指针(u_char*)的参数。 (我有点惊讶他们使用u_char指针,因为通常这些回调依赖于void指针,但这不是重点。)

您需要做的是以下两种方法之一:将指针封装在结构中。或者,你做了一些“创意铸造”。

STRUCT:

struct cb_struct {
   class1 *c1;
   class2 *c2;
};

//... In main or wherever

class1 c1;
class2 c2;

cb_struct cb_s = { &c1, &c2 };

pcap_loop( p, cnt, callback, reinterpret_cast<u_char*>(cb_s));

或者你对这个数组更有创意:

void * arg_arr[2] = { &c1, &c2 }; // Prefer void array so noone actually tries to use your pointers as what u_chars.

pcap_loop( p, cnt, callback, reinterpret_cast<u_char*>(arg_arr));

一旦你退回,你需要使用类似的东西:

void callback(u_char *arg_array, const struct pcap_pkthdr *h, const u_char *bytes) {
   void ** arg_arr = reinterpret_cast<void**>(arg_array);
   class1 * c1_ptr = reinterpret_cast<class1*>(arg_arr[0]);
   class2 * c2_ptr = reinterpret_cast<class2*>(arg_arr[1]);
}

或类似的结构。