pcap_分派/向回调函数传递参数

pcap_分派/向回调函数传递参数,c,network-programming,libpcap,C,Network Programming,Libpcap,我知道,pcap_dispatch在收到数据包时调用回调例程,传递给回调例程的第一个参数是pcap_dispatch函数的最后一个参数。那么回调例程的其余两个参数呢。pcap\u dispatch从哪里获得要传递的其他参数?我不完全确定我是否理解您的要求,但我想我可能能够涵盖它 首先,分派处理程序只是与此签名匹配的函数: int pcap_dispatch(pcap_t *p, int cnt, pcap_handler callback, u_char *user) 从右到左,参数包括从网络

我知道,
pcap_dispatch
在收到数据包时调用回调例程,传递给回调例程的第一个参数是
pcap_dispatch
函数的最后一个参数。那么回调例程的其余两个参数呢。
pcap\u dispatch
从哪里获得要传递的其他参数?

我不完全确定我是否理解您的要求,但我想我可能能够涵盖它

首先,分派处理程序只是与此签名匹配的函数:

int pcap_dispatch(pcap_t *p, int cnt, pcap_handler callback, u_char *user)
从右到左,参数包括从网络接口提取的数据包libpcap、pcap格式的数据包头和数据包处理程序的参数

我想如果有什么不同的话,第一个争论可能会给你带来麻烦。如果您需要传递多个参数,您可以这样做-这并不是您所期望的。如果要传递多个参数,可以简单地定义一个结构,而不是使用
va_args
。假设
typedef struct{…}myparams然后您可以传递:

void packethandler( u_char *args, const struct pcap_pkthdr* pkthdr, 
                    const u_char* packet )
作为参数并在处理程序中执行以下操作:

(u_char*) myparamstruct
这是因为您传递的是指针,而不是数据。指针的类型只是描述底层的、未引用的位置类型(一种解释数据的方式),而不是指针的实际值,因为所有指针的宽度都相同(无论如何,出于这个目的)


所以这可能包括把这些论点放进去。至于剩下的两个参数,正如我前面所说的,这些是libpcap从指定的网络接口捕获的。基本上,每次成功提取数据包时,都会通过函数指针调用处理程序,数据包详细信息编码在这些参数中,并通过用户提供的参数指针传递。

我不完全确定我是否理解您的要求,但我想我可能能够涵盖它

首先,分派处理程序只是与此签名匹配的函数:

int pcap_dispatch(pcap_t *p, int cnt, pcap_handler callback, u_char *user)
从右到左,参数包括从网络接口提取的数据包libpcap、pcap格式的数据包头和数据包处理程序的参数

我想如果有什么不同的话,第一个争论可能会给你带来麻烦。如果您需要传递多个参数,您可以这样做-这并不是您所期望的。如果要传递多个参数,可以简单地定义一个结构,而不是使用
va_args
。假设
typedef struct{…}myparams然后您可以传递:

void packethandler( u_char *args, const struct pcap_pkthdr* pkthdr, 
                    const u_char* packet )
作为参数并在处理程序中执行以下操作:

(u_char*) myparamstruct
这是因为您传递的是指针,而不是数据。指针的类型只是描述底层的、未引用的位置类型(一种解释数据的方式),而不是指针的实际值,因为所有指针的宽度都相同(无论如何,出于这个目的)


所以这可能包括把这些论点放进去。至于剩下的两个参数,正如我前面所说的,这些是libpcap从指定的网络接口捕获的。基本上,每次成功提取数据包时,都会通过函数指针调用处理程序,数据包详细信息编码在这些参数中,并通过用户提供的参数指针传递。

其他两个参数来自刚刚捕获的数据包(如果使用
pcap\u open\u live()
pcap\u create()
/
pcap\u activate()
打开
pcap\u t
)或读取捕获文件(如果使用
pcap\u open\u offline()
打开
pcap\u t
)-
pkthdr
是一种包含数据包时间戳的结构,数据包在网络上显示时的长度,数据包被快照长度缩短后的长度,
packet
是原始数据包数据。

其他两个参数来自刚刚捕获的数据包(如果使用
pcap\u open\u live()
pcap\u create()
pcap\u activate()
打开
pcap\u t
)或者从捕获文件读取(如果您使用
pcap\u open\u offline()
打开
pcap\u t
)-
pkthdr
是一种结构,包含数据包的时间戳、数据包在网络上出现时的长度以及数据包被快照长度缩短后的长度,
packet
是原始数据包数据