捕获数据包而没有回调
本课程中的示例程序与以前的程序(打开适配器和捕获数据包)完全相同,但它使用pcap_next_ex()而不是pcap_loop()。
pcap_loop()的基于回调的捕获机制是优雅的,在某些情况下可能是一个很好的选择。

但是,处理回调有时是不实际的 - 通常会使程序更加复杂,特别是在多线程应用程序或C ++类的情况下。
在这些情况下,pcap_next_ex()使用直接调用检索数据包 - 只有在程序员想要的时候才使用pcap_next_ex()数据包。
该函数的参数与捕获回调相同 - 它需要一个适配器描述符和一些将被初始化并返回给用户的指针(一个到pcap_pkthdr结构,另一个指向具有数据包数据的缓冲区)。
在以下程序中,我们回收上一课程示例的回调代码,并在调用pcap_next_ex()之后将其移动到main()中。

#include "pcap.h"int main()
{
pcap_if_t *alldevs;
pcap_if_t *d;
int inum;
int i=0;
pcap_t *adhandle;
int res;
char errbuf[PCAP_ERRBUF_SIZE];
struct tm ltime;
char timestr[16];
struct pcap_pkthdr *header;
const u_char *pkt_data;
time_t local_tv_sec;/* Retrieve the device list on the local machine */if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &alldevs, errbuf) == -1){fprintf(stderr,"Error in pcap_findalldevs: %s\n", errbuf);exit(1);}/* Print the list */for(d=alldevs; d; d=d->next){printf("%d. %s", ++i, d->name);if (d->description)printf(" (%s)\n", d->description);elseprintf(" (No description available)\n");}if(i==0){printf("\nNo interfaces found! Make sure WinPcap is installed.\n");return -1;}printf("Enter the interface number (1-%d):",i);scanf_s("%d", &inum);if(inum < 1 || inum > i){printf("\nInterface number out of range.\n");/* Free the device list */pcap_freealldevs(alldevs);return -1;}/* Jump to the selected adapter */for(d=alldevs, i=0; i< inum-1 ;d=d->next, i++);/* Open the device */if ( (adhandle= pcap_open(d->name,          // name of the device65536,            // portion of the packet to capture. // 65536 guarantees that the whole packet will be captured on all the link layersPCAP_OPENFLAG_PROMISCUOUS,    // promiscuous mode1000,             // read timeoutNULL,             // authentication on the remote machineerrbuf            // error buffer) ) == NULL){fprintf(stderr,"\nUnable to open the adapter. %s is not supported by WinPcap\n", d->name);/* Free the device list */pcap_freealldevs(alldevs);return -1;}printf("\nlistening on %s...\n", d->description);/* At this point, we don't need any more the device list. Free it */pcap_freealldevs(alldevs);/* Retrieve the packets */while((res = pcap_next_ex( adhandle, &header, &pkt_data)) >= 0){if(res == 0)/* Timeout elapsed */continue;/* convert the timestamp to readable format */local_tv_sec = header->ts.tv_sec;localtime_s(<ime, &local_tv_sec);strftime( timestr, sizeof timestr, "%H:%M:%S", <ime);printf("%s,%.6d len:%d\n", timestr, header->ts.tv_usec, header->len);}if(res == -1){printf("Error reading the packets: %s\n", pcap_geterr(adhandle));return -1;}return 0;
}

为什么我们使用pcap_next_ex()而不是旧的pcap_next()?因为pcap_next()有一些缺点。首先,它是低效的,因为它隐藏回调方法,但仍依赖于pcap_dispatch()。第二,它不能检测到EOF,所以在从文件中收集数据包时不是很有用。

还要注意,pcap_next_ex()返回成功,超时时间,错误和EOF条件的不同值。

c++ winpcap开发(4)相关推荐

  1. 在Visual Studio 2005下配置WinPcap开发环境

    在Visual Studio 2005下配置WinPcap开发环境 http://www.winpcap.org/archive/ 4.1beta5_WpdPack.zip http://www.wi ...

  2. winpcap 开发

    Winpcap是一个强大的网络开发库,可以实现许多功能:获取可用的网络适配器:获取指定适配器信息(比如名称和描述信息):捕获指定网卡的数据封包:发送数据封包:过滤捕获的包以获取特定包等. 首先到htt ...

  3. socket编程之DEV C++配置winpcap开发环境并编写网络嗅探器sniffer

    欢迎关注我的个人博客:www.zuzhiang.cn 期末计算机网络课程设计让做一个网络嗅探器,要求可以检测和选择网卡,并打开到混杂模式,监听局域网中的所有数据包并解析出所用网络协议以及首部各个字段的 ...

  4. codeblocks配置winpcap开发环境

    转载请注明出处,谢谢_ (:з」∠)_ 起因 最近作业要用Winpcap开发包分析.pcap文件实现报文字段的识别-本来打算用Visual Studio写,不过想起以前打OJ的时候都用Code::Bl ...

  5. Dev-C++ 配置 WinPcap 开发环境

    VC++ 6.0实在是太老了,自己并不愿意在这个平台上开发,所以转而使用Dev-C++,以下是综合网上的教程和自己的试验总结出的用Dev-C++进行WinPcap网络开发的所需的环境配置工作: 首先是 ...

  6. 一步一步开发sniffer(Winpcap+MFC)(一)工欲善其事,必先配环境——配置winpcap开发环境

    0.说在前面的话 1) 本文将以一个初学者的角度,一步一步几乎是从0开始讲述如何完成一个基于winpcap+MFC的sniffer(嗅探器)当然我指的"0"并不是指连编程都不会,如 ...

  7. 基于winpcap开发的相关资料

    2019独角兽企业重金招聘Python工程师标准>>> http://www.oschina.net/code/snippet_196111_7100 http://wenku.ba ...

  8. c++ winpcap开发(9)

    收集网络流量统计 本课程展示了WinPcap的另一个高级功能:收集网络流量统计信息的能力.统计引擎利用内核级包过滤器对传入的数据包进行有效的分类.如果您想了解更多详细信息,可以参考NPF驱动程序内部手 ...

  9. c++ winpcap开发(8)

    发送数据包 虽然名称WinPcap清楚地表明图书馆的目的是分组捕获,但还提供了其他有用的原始网络功能.其中,用户可以找到一组完整的功能来发送数据包. 请注意,原来的libpcap库目前没有提供任何方式 ...

  10. c++ winpcap开发(7)

    处理离线转储文件 在这个课程中,我们将学习如何处理数据包捕获到一个文件(转储到文件).WinPcap提供广泛的功能来将文件的网络流量保存到文件并读取转储的内容 - 本课将介绍如何使用所有这些功能.我们 ...

最新文章

  1. C语言之详解#ifdef等宏
  2. SAP UI5 函数节流和异步完成令牌的应用
  3. Swift学习笔记 闭包表达式
  4. python一些简单操作_python列表的基本操作有哪些
  5. Java-抽象类第一篇认识抽象类
  6. 这10个比较好用的服务器管理软件你都知道吗?
  7. 图像质量评价函数SSIM介绍
  8. resin设置权限_Resin学习笔记
  9. oracle12c rac 开启hugepage
  10. Java实习生常规技术面试题每日十题Java基础(二)
  11. HEVC学习-帧内预测-initAdiPattern函数
  12. python绘制子图技巧——plt.subplot和plt.subplots、及坐标轴修改
  13. 对于手写签名生成图片储存和回显的实现
  14. R语言入门——工作空间管理函数
  15. 微信支付宝用二维码支付服务谁能征服世界
  16. 贝叶斯网络python代码_贝叶斯网络,看完这篇我终于理解了(附代码)!
  17. 周期性无功电流扰动的孤岛检测仿真
  18. 别人的随笔(非常有用)
  19. Our4.org:[时区设定]功能漏洞或致 IPHONE 4S 电池续航减弱
  20. Java毕设项目的创意项目众筹平台的设计与开发(java+VUE+Mybatis+Maven+Mysql)

热门文章

  1. 临床外显子组测序分析中的那些坑(下)
  2. Autodesk Flame 2022 for Mac - 高级三维视觉特效合成软件
  3. ae画面颜色一键选取替换修改插件Composite Brush for Mac 1.5.2
  4. Python相关的考试和认证
  5. 《小学生C++趣味编程》第42课 最小公倍数
  6. GIT上传下载报错:[You do not have permission to pull from the repository]的解决方案!
  7. STM32学习之总线与时钟
  8. MySQL笔记-centos7安装MySQL5.7.25(glibc版)
  9. Arduino笔记-WeMos D1通过HTTP亮熄灯
  10. C++/Qt工作笔记-static_cast在connect函数中的运用