这个回调函数的参数是怎么传进去的?

XSign 2008-05-14 06:12:39
最近在用winpcap写程序,遇到了一些问题。
首先是一个结构
struct hook_and_sinker
{
void (*hook)(packet_data *,void **);
int proc_flags;
bpf_u_int32 liktype;
}

struct hook_and sinker *hs;

hs.hook=my_hook;
hs.proc_flags=get_tcp_flags;
hs.linktype=pcap_datalink(descr);

pcap_loop(descr,sniffer_number,got_packet,(u_char *)&hs);

其中got_packet是一个回调函数,pcap_loop的函数原型为:

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

typedef void(* pcap_handler)(u_char *user, const struct pcap_pkthdr *pkt_header, const u_char *pkt_data)

回调函数got_packet原型为
got_packet(u_char *args,const struct pcap_pkthdr *hander,const u_char *packet)

在csdn上查到的是got_packet函数的参数与pcap_loop函数的最后一个参数有关。

1、那么got_packet的参数是怎么传进去的呢?
2、参数是否和hook_and_sinker结构中的变量有关?如果有对应关系怎样?
...全文
753 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
xy121z 2012-06-02
  • 打赏
  • 举报
回复
被同样的问题困惑过
htqx 2008-05-15
  • 打赏
  • 举报
回复

typedef void (*Func)(int); //函数指针类型

---------------------------------服务器
void call(Func pf)
{
pf(1); //实参
}
---------------------------------客户段
void myFunc(int i)
{
cout << i << endl;
}

int main()
{
call( &myFunc ); //传递函数指针,call内部调用你的函数,所以"回调".
}
XSign 2008-05-15
  • 打赏
  • 举报
回复
我知道参数是由编程人员给定的啊。
可是got_packet的形参接受哪里传过来的参数,也就是说这个函数的实参列表在哪里呢?
用户 昵称 2008-05-15
  • 打赏
  • 举报
回复
已经有了函数,他的参数由编程人员给定的,而不是由调用他的父函数给定。
XSign 2008-05-15
  • 打赏
  • 举报
回复
每人知道吗?
XSign 2008-05-14
  • 打赏
  • 举报
回复
对啊,可是我并没有看到got_packet的参数类表啊?
这个callback函数的实参在哪里?
ttkk_2007 2008-05-14
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 XSign 的回复:]
我想弄明白的是
got_packet(u_char *args,const struct pcap_pkthdr *hander,const u_char *packet)
我可以控制向这个函数传入的参数吗?
[/Quote]
这里面的参数肯定是在pcap_loop函数里面,由pcap_loop来控制的,如

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

}

XSign 2008-05-14
  • 打赏
  • 举报
回复
我想弄明白的是
got_packet(u_char *args,const struct pcap_pkthdr *hander,const u_char *packet)
我可以控制向这个函数传入的参数吗?
用户 昵称 2008-05-14
  • 打赏
  • 举报
回复
没明白楼主到底想问什么,你认为函数指针就是一个指针,也许会容易点。
XSign 2008-05-14
  • 打赏
  • 举报
回复
上面输错了,
b->hook(&pdata,b->args);//这句
应该是
a->hook(&pdata,b->args);//这句
不好意思哈
XSign 2008-05-14
  • 打赏
  • 举报
回复
可是在got_packet在后面又调用了一个函数:
got_packet(u_char *args,const struct pcap_pkthdr *hander,const u_char *packet)
{
process_pcap(args,header,packet);
}

void process_pcap(u_char *user,const struct pcap_pkthdr *h,const u_char *p)
{
struct hook_and_sniker *a;
a=(struct hook_and_sniker *)user;
.......
b->hook(&pdata,b->args);//这句
}
书上说上面加注释得那句调用得函数是
hs.hook=my_hook;
定义得函数,就是my_hook()函数。

所以我想知道got_packet函数得参数是怎么传递得。。。?
xkyx_cn 2008-05-14
  • 打赏
  • 举报
回复
pcap_loop(descr,sniffer_number,got_packet,(u_char *)&hs);

这样不就传进去了吗? got_packet表示函数的地址

packet是回调函数,不是你调用的,它的参数传入不需要你负责

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧