介绍程序模块前,这一节再复习一下WinPcap

WinPcap开发一个嗅探器的主要步骤如下:

(1)获取嗅探设备

WinPcap提供了pcap_findalldevs_ex() 函数来实现这个功能: 这个函数返回一个pcap_if 结构的链表,每个这样的结构都包含了一个适配器的详细信息:

     /* 获取本地机器设备列表 */
if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL /* auth is not needed */, &alldevs, errbuf) == -)
{
fprintf(stderr,"Error in pcap_findalldevs_ex: %s\n", errbuf);
exit();
}

(2)打开设备,建立嗅探会话

打开设备的函数是 pcap_open()  ,snaplen 制定要捕获数据包中的哪些部分,flag是用来指示适配器是否要被设置成混杂模式,to_ms 指定读取数据的超时时间,以毫秒计:

  /* 打开设备 */
if ( (adhandle= pcap_open(d->name, // 设备名
, // 65535保证能捕获到不同数据链路层上的每个数据包的全部内容
PCAP_OPENFLAG_PROMISCUOUS, // 混杂模式
, // 读取超时时间
NULL, // 远程机器验证
errbuf // 错误缓冲池
) ) == NULL)
{
fprintf(stderr,"\nUnable to open the adapter. %s is not supported by WinPcap\n", d->name);
/* 释放设备列表 */
pcap_freealldevs(alldevs);
return -;
}

(3)设置过滤器

用来过滤数据包的函数是 pcap_compile() 和 pcap_setfilter(),pcap_compile() 它将一个高层的布尔过滤表达式编译成一个能够被过滤引擎所解释的低层的字节码,pcap_setfilter() 将一个过滤器与内核捕获会话向关联。当 pcap_setfilter() 被调用时,这个过滤器将被应用到来自网络的所有数据包,并且,所有的符合要求的数据包 (即那些经过过滤器以后,布尔表达式为真的包) ,将会立即复制给应用程序:

 compile the filter
if (pcap_compile(adhandle, &fcode, "ip and tcp", , netmask) < )
{
fprintf(stderr,"\nUnable to compile the packet filter. Check the syntax.\n");
/* 释放设备列表 */
pcap_freealldevs(alldevs);
return -;
} set the filter
if (pcap_setfilter(adhandle, &fcode) < )
{
fprintf(stderr,"\nError setting the filter.\n");
/* 释放设备列表 */
pcap_freealldevs(alldevs);
return -;
}

(4)捕获网络数据包

pcap_loop()函数是基于回调的原理来进行数据捕获,这是一种精妙的方法,并且在某些场合中,它是一种很好的选择。 然而,处理回调有时候并不实用 -- 它会增加程序的复杂度,特别是在拥有多线程的C++程序中。可以通过直接调用pcap_next_ex() 函数来获得一个数据包:

  pcap_next_ex( adhandle, &header, &pkt_data)

返回值的意义如下:

  • 1 if the packet has been read without problems
  • 0 if the timeout set with pcap_open_live() has elapsed. In this case pkt_header and pkt_data don't point to a valid packet
  • -1 if an error occurred
  • -2 if EOF was reached reading from an offline capture

(5)处理网络数据包

(6)释放设备列表

void  pcap_freealldevs(pcap_if_t * * alldevs // 前面获取的设备列表)

其流程大致可以概括为这样:

下一节 MFC+WinPcap编写一个嗅探器之四(获取模块)

最新文章

  1. WPF自定义控件第二 - 转盘按钮控件
  2. nginx源码分析之hash的实现
  3. 字符串截取函数--C语言(转)
  4. 【转】所需即所获:像 IDE 一样使用 vim
  5. 【HTML】Beginner8:Table
  6. eclipse,android Localization (Internationalization) 安卓本地化(国际化)
  7. Phpcms 前台页面实现分页
  8. React 深入系列1:React 中的元素、组件、实例和节点
  9. delphi中响应鼠标进入或离开控件的方法
  10. YII - 打印 SQL
  11. 【C#写日志两个简单方法】
  12. 前端 ---client、offset、scroll系列
  13. 2013年蓝桥杯省赛C/C++A组真题解析
  14. aix 查看内存,CPU 配置信息
  15. 遍历form表单里面的表单元素,取其value
  16. DelphiXE5如何获取Android手机SIM卡串号[转]
  17. DC之setup-hold time详解
  18. 从零开始学习html(十五)css样式设置小技巧——下
  19. Java操作Excel之Poi
  20. Matrix(二分套二分)

热门文章

  1. Java基础-包(package)的声明与访问
  2. Java基础-面向对象第二特征之继承(Inheritance)
  3. RACCommand中的信号
  4. Object-C使用类静态方法创建对象时容易内存泄露
  5. python字符中加入变量
  6. 2017 国庆湖南 Day1
  7. [NOI导刊2010提高&amp;洛谷P1774]最接近神的人 题解(树状数组求逆序对)
  8. 添加 MySql 服务、Tomcat服务到windows服务中
  9. http方式传递参数值转义或乱码的处理(base64)
  10. 树形dp(A - Anniversary party HDU - 1520 )