Chinaunix首页 | 论坛 | 博客
  • 博客访问: 530411
  • 博文数量: 18
  • 博客积分: 352
  • 博客等级: 二等列兵
  • 技术积分: 770
  • 用 户 组: 普通用户
  • 注册时间: 2011-09-15 15:44
文章分类

全部博文(18)

文章存档

2013年(4)

2012年(1)

2011年(13)

分类: C/C++

2011-11-21 10:22:28

什么是回调函数
简单的说回调函数就是一个通过函数指针调用的函数。如果把函数的指针作为函数参数传递给另一个函数,当这个函数指针作为调用者而只想某个函数时,这就是回调函数。回调憾事不是由该函数实现方来直接调用,而是在特定的事件或者在特定的条件下又另外一方调用的,对已该事件或条件进行响应。
 回调函数并不是什么新的事物,更有甚者他在很多的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 struct pcap_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.     /*open the 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.     return 0;
  30. }

  31. void getpacket(u_char *args,const struct pcap_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]$gcc testpcap.c -lpcap
  2. [#28#caopeng@caopeng-desktop ~/桌面/pcap]$sudo ./a.out
  3. DEV :eth0
  4. The 0's packet has grab...
  5. The 1's packet has grab...
  6. The 2's packet has grab...
  7. The 3's packet has grab...
  8. The 4's packet has grab...
  9. The 5's packet has grab...


本文系笔者原创
参考资料:


阅读(5119) | 评论(0) | 转发(0) |
0

上一篇:使用pcap库进行编程

下一篇:Jni编程

给主人留下些什么吧!~~