打开适配器并捕获数据包

现在我们已经看到如何获得适配器来玩,让我们开始真正的工作,打开适配器并捕获一些流量。
我们将编写一个程序,其中打印出一些关于流经适配器的数据包的信息。
打开捕获设备的功能是pcap_open()。参数,snaplen,标志和to_ms值得一些解释。

snaplen指定要捕获的数据包的部分。在某些操作系统(如xBSD和Win32)上,数据包驱动程序可以配置为仅捕获任何数据包的初始部分:这会减少要复制到应用程序的数据量,从而提高捕获效率。在这种情况下,我们使用的值65536高于我们可能遇到的最大MTU值。以这种方式,我们确保应用程序将始终收到整个数据包。
标志:最重要的标志是指示适配器是否将处于混杂模式的标志。在正常操作中,适配器仅捕获来自网络的分发给它的分组; 因此,其他主机交换的数据包被忽略。相反,当适配器处于混杂模式时,它将捕获所有数据包是否注定到它。这意味着在共享介质(如非交换式以太网)上,WinPcap将能够捕获其他主机的数据包。混杂模式是大多数捕获应用程序的默认模式,因此我们在以下示例中启用它。

to_ms指定读取超时(以毫秒为单位)。即使没有来自网络的数据包,适配器上的读取(例如,使用pcap_dispatch()或pcap_next_ex())将始终在to_ms毫秒之后返回。如果适配器处于统计模式,to_ms还会定义统计报告之间的间隔。将to_ms设置为0表示没有超时,如果没有数据包到达,则适配器上的读取将永远不会返回。另一端的-1超时导致适配器上的读取始终立即返回。
#include "pcap.h"/* prototype of the packet handler */
void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data);int main()
{
pcap_if_t *alldevs;
pcap_if_t *d;
int inum;
int i=0;
pcap_t *adhandle;
char errbuf[PCAP_ERRBUF_SIZE];/* 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);/* start the capture */pcap_loop(adhandle, 0, packet_handler, NULL);return 0;
}/* Callback function invoked by libpcap for every incoming packet */
void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data)
{struct tm ltime;char timestr[16];time_t local_tv_sec;/** unused variables*/(VOID)(param);(VOID)(pkt_data);/* convert the timestamp to readable format */local_tv_sec = header->ts.tv_sec;localtime_s(&ltime, &local_tv_sec);strftime( timestr, sizeof timestr, "%H:%M:%S", &ltime);printf("%s,%.6d len:%d\n", timestr, header->ts.tv_usec, header->len);}

一旦适配器打开,捕获可以用pcap_dispatch()或pcap_loop()启动。这两个函数非常相似,不同之处在于pcap_ dispatch()返回(尽管不能保证)超时时pcap_loop()不会返回,直到cnt数据包被捕获为止,因此它可以在利用不足的网络。pcap_loop()足以用于此示例,而pcap_dispatch()通常用于更复杂的程序中。

这两个函数都有一个回调参数packet_handler,指向一个将接收数据包的函数。该函数由libpcap为来自网络的每个新数据包调用,并接收通用状态(对应于pcap_loop()和pcap_dispatch()的用户参数),该报头具有数据包的一些信息,如时间戳和长度,数据包的实际数据包括所有协议头。请注意,帧CRC通常不存在,因为在帧验证后由网络适配器删除它。还要注意,大多数适配器丢弃CRC错误的数据包,因此WinPcap通常不能捕获它们。

上述示例从pcap_pkthdr头提取每个数据包的时间戳和长度,并将其打印在屏幕上。

请注意,使用pcap_loop()可能存在缺点,主要涉及到数据包捕获驱动程序调用处理程序的事实; 因此用户应用程序没有直接的控制权。另一种方法(并且具有更多可读程序)是使用pcap_next_ex()函数,该函数在下一个示例中显示(捕获不带回调的数据包)。

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

  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. 【Java 网络编程】TCP API 简介 ( Socket | ServerSocket )
  2. C#.net调用Excel出现问题
  3. Morphia和MongoDB:不断发展的文档结构
  4. ice库c语言例子,很不多的ICE架构入门学习例子
  5. Asp.Net Core 轻松学-利用日志监视进行服务遥测
  6. Java虚拟机(十二)——StringTable
  7. 二叉树为空意味着二叉树_我是怎么调试出来二叉树的遍历(超精彩配图),从此遍历不再愁了...
  8. iOS中__block 关键字的底层实现原理
  9. 管理员后台爆破扫描器-WebCrack
  10. 解读华为的流程与 IT 管理部门
  11. Web开发过程流程图
  12. 获取Orcal编码格式为US7ASCII中文数据乱码问题;
  13. iOS 开发的一些奇巧淫技
  14. 软件测试面试题:请详细介绍一下各种测试类型的含义?
  15. 提高效率5款多功能实用软件推荐
  16. el-form和el-col响应式布局
  17. 如何解决数组下标越界异常
  18. dw怎么在框架中加入网页_如何在Dreamweaver中创建框架结构? dw设置框架结构的教程...
  19. 100寸大屏幕的影院观感 神画Q1智能影院了解一下
  20. 武汉理工大学操作系统 课内实验

热门文章

  1. html overflow 样式,css修改overflow滚动条默认样式
  2. oracle统计学生成绩c,Oracle11g学生成绩管理系统.docx
  3. h5点击后字体加粗出现下边框_人力资源管理论文格式(字体+版式+打印)
  4. springboot日志配输出路径配置_SpringBoot日志配置详解
  5. sql去重复查询distinct_SQL的简单查询
  6. 这个处理不同基因组区域关系的工具集很不错!
  7. 兼容最新PS2021 Raya Pro 5 for Mac——值得推荐的PS终极数字混合扩展面板
  8. 文件服务器 工作站 通信媒体,用于多工作站/多平台非线性视频编辑系统的媒体文件访问和存储解决方案...
  9. birt脚本for循环语句_如何使用 for 循环语句嵌套方法!
  10. Arduino笔记-9110风扇模块的使用