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

标签 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 回调,如下所示:

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[] -> u_char * 转换错误。我还收到关于从较小类型 (u_char *) 转换为较大类型 (class1 *, class2 *) 的警告。

执行此操作的正确方法是什么?

最佳答案

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

您需要做的是以下两项之一:要么将指针封装在结构中。或者,您进行一些“创意选角”。

结构:

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

或者类似的结构。

关于c++ - 如何将多个参数传递给 pcap_loop()/pcap_handler()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24768543/

相关文章:

c++ - 如何将 lambda 用于容器比较运算符?

c++ - 是否可以创建没有真实文件的ifstream

c++ - 函数模板推导和initlializer_list

linux - 在没有内存映射支持的Linux中编译libpcap

c++ - 如何在 C++ 中将 Windows 位图转换为 Actionscript 位图

c - libpcap 丢弃来自特定 IP 的一些数据包

c - 在 C 中打开 .pkt(Omnipeek capture)文件

wireshark - 如何使用 tshark 或任何其他工具从现有 pcap 文件中提取全套功能?

macos - 使用/usr/include/net/if.h编译出错

c - libpcap:带有 "own"缓冲区的 pcap_next_ex