c - pcap_dispatch/将参数传递给回调函数

标签 c network-programming libpcap

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

据我所知,pcap_dispatch 在收到数据包后调用回调例程,并且传递给回调例程的第一个参数是 pcap_dipatch 函数的最后一个参数。那么回调例程的其余两个参数又如何呢? pcap_dispatch 从哪里获取要传递的其他参数?

最佳答案

我不完全确定我明白你在问什么,但我想我也许能够回答它。

首先,调度处理程序只是一个与此签名匹配的函数:

void packethandler( u_char *args, const struct pcap_pkthdr* pkthdr, 
                    const u_char* packet )

参数从右到左依次为 libpcap 从网络接口(interface)提取的数据包、pcap 格式数据包 header 以及数据包处理程序的参数。

我想如果有的话,第一个参数可能会给你带来问题。如果您需要传递多个参数,您可以这样做 - 只是这并不完全符合您的预期。如果您想传递多个参数,您可以简单地定义一个结构体,而不是使用 va_args。假设 typedef struct { ... } myparams; 您可以传递:

(u_char*) myparamstruct

作为参数并在处理程序内部执行以下操作:

myparams* params = (myparams*) args;

这是有效的,因为您传递的是指针,而不是数据。指针的类型只是描述底层的、取消引用的位置类型(一种解释数据的方式),而不是指针的实际值 - 因为所有指针都是同样宽的(无论如何,出于此目的)。

因此,这可能涉及获取这些参数。至于剩下的两个参数,正如我之前所说,这些是 libpcap 从指定网络接口(interface)捕获的内容。本质上,每次成功提取数据包时,都会通过函数指针调用处理程序,数据包详细信息编码在这些参数中并通过用户提供的参数指针传递。

关于c - pcap_dispatch/将参数传递给回调函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9243130/

相关文章:

c++ - 如何以 pcap 格式保存以太网帧

使用 libpcap 捕获任何接口(interface)时无法获取协议(protocol)

c - 主循环设置什么参数

c - 是否可以将 linux 计时器通知信号定向到特定线程?

linux - 是否可以模仿 UDP 数据包的源/目标 IP?

c++ - 从 ICMP 报文访问 UDP

objective-c - 在 Objective C 中调用 C 回调

c - C 中的上层函数

c - 如何删除C程序中 "ctime"之后的换行符?

http - 在 Racket 中发送 HTTP POST