回调函数

什么是回调函数

简单的说回调函数就是一个通过函数指针调用的函数。如果把函数的指针作为函数参数传递给另一个函数,当这个函数指针作为调用者而只想某个函数时,这就是回调函数。回调憾事不是由该函数实现方来直接调用,而是在特定的事件或者在特定的条件下又另外一方调用的,对已该事件或条件进行响应。
 回调函数并不是什么新的事物,更有甚者他在很多的API当中都能够找的到。有关回调函数的概念在我介绍之后,你会发现他很简单。假定有一段代码一直在等待某个事件或者是需要进行排序。为此我们假设我的程序需要用户摁下键盘上的某个按键,每当用户摁下一个按键的时候,就调用一个函数来决定对应与该按键需要做什么。这个函数我利用回调函数这种技术来实现。每当用户摁下一个按键的时候,我的程序就会调用相应的回调函数。

回调函数的实现机制
  1. 定义一个回调函数
  2. 提供函数实现的的程序在初始化的时候,将回调函数的函数指针注册给调用者;
  3. 当特定事件或者条件发生的时候,调用者使用函数指针调用回调函数对事件进行处理。
我们为什需要使用回调函数
  回调函数分离了回调函数的实现者和回调函数的提供者;我们不必关心函数提供者是如何实现的谁是回调函数的提供者。我们所知道的仅仅是回调函数提供者提供的一个确定的回调函数的原型和一些限制性条件(例如:该回调函数的返回值为int类型...)。
如果对于回调函数在实际当中有什么作用感到疑惑,那么当你在读完本章节之后相信你的疑惑应该会有所消除。现在假设在我们编写的某个程序当中需要大量的使用到某些排序算法(冒泡、快速、shell等等...),
  • 一个很简单的办法就是当用到排序的时候,我们就将相应的排序算法代码重新的写一次,但是这样以来代码量就很大很大了...以后会有各种的不利因素,
  • 所以更近一步就是将相应的算法抽象成为某一类的排序函数,当需要使用的时候就去调用;这样以来就大大的缩短了代码量;
  • 可是?还有米有一种更好的方法呢?答案是肯定的,我们可以编写一个对应的库,这个库实现了各种、各个数据类型的排序算法,但是我们应该怎么来实现这个库呢?那当然就是回调函数了!
源代码实例
现在就笔者的毕设当中的一个实例代码贴在这里:关于该程序的运行室需要的一些库,请阅读前几篇博文。
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <pcap.h>
  4. #include <errno.h>
  5. #include <sys/socket.h>
  6. #include <netinet/in.h>
  7. #include <arpa/inet.h>
  8. #include <netinet/if_ether.h>
  9. void getpacket(u_char *,const structpcap_pkthdr *,const u_char *);
  10. int main(int argc,char **argv)
  11. {
  12.     char            *dev;
  13.     char            errbuf[PCAP_ERRBUF_SIZE];
  14.     pcap_t            *descr;
  15.     dev = pcap_lookupdev(errbuf);
  16.     if(dev == NULL){
  17.         printf("%s\n",errbuf);
  18.         exit(1);
  19.     }
  20.     printf("DEV:%s\n",dev);
  21.     
  22.     /*openthe device for sniffing*/
  23.     descr = pcap_open_live(dev,BUFSIZ,0,-1,errbuf);
  24.     if(descr == NULL){
  25.         printf("pcap_open_live():%s\n",errbuf);
  26.         exit(1);
  27.     }
  28.     pcap_loop(descr,6,getpacket,NULL);

  29.     return0;
  30. }

  31. void getpacket(u_char *args,const structpcap_pkthdr *header,const u_char *packet)
  32. {
  33.     static int count = 0;
  34.     printf("The%d's packet has grab...\n",count);
  35.     count++;
  36. }
pcap_loop()函数注册了一个回调函数getpacket()。每当网卡设备dev有数据包到达的时候,边调用回调函数getpacket()执行相应的代码。
编译,执行结果如下:
  1. [#27#caopeng@caopeng-desktop ~/桌面/pcap]$gcctestpcap.-lpcap
  2. [#28#caopeng@caopeng-desktop ~/桌面/pcap]$sudo ./a.out 
  3. DEV :eth0
  4. The 0's packet hasgrab...
  5. The 1's packet hasgrab...
  6. The 2's packet hasgrab...
  7. The 3's packet hasgrab...
  8. The 4's packet hasgrab...
  9. The 5's packet hasgrab...


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值