这一节主要介绍如何获设置捕获过滤,这里的过滤是指在捕获前过滤

设置捕获过滤主要是在CFilterDlg中完成,也就是对应之前创建的设置过滤规则对话框,如图:

首先要根据用户的选择来生成一个合法的过滤规则字符串,根据WinPcap的要求,合法的过滤规则可以是如下几种:

1) 表达式支持逻辑操作符,可以使用关键字 and、or、not对子表达式进行组合,同时支持使用小括号。
2) 基于协议的过滤要使用协议限定符,协议限定符可以为ip、arp、rarp、tcp、udp等。
3) 基于MAC地址的过滤要使用限定符ether(代表以太网地址)、当该MAC地址仅作为源地址时表达式为ether src mac_addr,仅作为目的地址时,表达式为ether dst mac_addr,既作为源地址又作为目的地址时的表达式为ether host mac_addr。此外应注意mac_addr应该遵从00:E0:4C:E0:38:88的格式,否则编译过滤器时会出错。
4) 基于IP地址的过滤应该使用限定符host(代表主机地址)。当该IP地址仅作为源地址时过滤表达式应为 src host ip_addr,仅作为目的地址时的表达式为 dst host ip_addr,既作为源地址又作为目的地址时表达式为 host ip_addr。
5) 基于端口的过滤应使用限定符 port。例如仅接收80端口的数据包则表达式为port 80。

下边给出两个例子:
例1:只捕获arp或icmp数据包。
过滤表达式:arp or (ip and icmp)
例2:捕获主机192.168.1.23与192.168.1.28之间传递的所有UDP数据包。
过滤表达式:(ip and udp)and( host 192.168.1.23 or host 192.168.1.28)

这样可以用以下代码来生成一个合法的过滤规则:首先生成一个点击确定的触发函数,之后添加如下代码

 void CFilterDlg::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码
if ( == m_tcp.GetCheck())
{
filtername += _T("(tcp and ip) or ");
}
if ( == m_udp.GetCheck())
{
filtername += _T("(udp and ip) or ");
}
if ( == m_arp.GetCheck())
{
filtername += _T("arp or ");
}
if ( == m_rarp.GetCheck())
{
filtername += _T("rarp or ");
}
if ( == m_icmp.GetCheck())
{
filtername += _T("(icmp and ip) or ");
}
if ( == m_igmp.GetCheck())
{
filtername += _T("(igmp and ip) or ");
} filtername = filtername.Left(filtername.GetLength()-); //注意去掉最后多余的" or ",否则过滤规则不成立 CDialogEx::OnOK(); }

这里想补充一点关于单选框和复选框的判断是否选择的问题

判断按钮是否选中:

复选:1 == m_tcp.GetCheck()

单选和复选:不能用GetCheck()可以用通用的if (((CButton *)GetDlgItem(IDC_RADIO1))->GetCheck())用按钮ID来选择

在默认设置时两者也有区别:

复选:m_tcp.SetCheck(1)

单选和复选:CheckDlgButton(IDC_RADIO1, 1)

也就是说复选和单选都可以通过按钮的ID来设置,而复选又多了自己的一个专门函数用来设置。

回到程序,在生成一段合法的字符串后将filtername返回给主窗口,设置和编译过滤规则的函数也在主窗口中处理,这些内容在下一节介绍吧

下一节 MFC+WinPcap编写一个嗅探器之六(分析模块)

最新文章

  1. Java 中文字符串编码之GBK转UTF-8
  2. iOS开发备忘录:自定义UINavigationBar背景图片和Back按钮
  3. Android之布局onClick属性写法规则
  4. 10.30Daily Scrum
  5. Linux进程间通信IPC学习笔记之有名管道
  6. Ubuntu学习笔记-win7&Ubuntu双系统简单搭建系统指南
  7. OCA读书笔记(15) - 执行数据库备份
  8. Cocos2dx 3.0 交流篇
  9. 【C语言的日常实践(十六)】字符串输出功能puts、fputs和printf
  10. 05.haproxy+mysql负载均衡 整合 redis集群+ssm
  11. CTSC 2017 滚粗记
  12. dedecms 使用自由列表实现首页列表分页
  13. [ SSH框架 ] Spring框架学习之三(AOP开发和注解的使用)
  14. 第四章Android移植环境搭建
  15. minikube windows hyperx填坑记
  16. python设计模式第二十三天【状态模式】
  17. 2017-12-15python全栈9期第二天第三节之使用while循环输出0到10不包含7
  18. 在Java程序中读写windows共享文件夹
  19. Scrapy学习篇(七)之Item Pipeline
  20. MySQL性能调优与架构设计——第12章 可扩展设计的基本原则

热门文章

  1. day3 程序流程控制
  2. WAV MP3 Converter-强大的音频转换软件-特别版
  3. bzoj 3309 反演
  4. Java并发编程原理与实战三十三:同步容器与并发容器
  5. idea绘制activity流程图中文乱码解决
  6. APScheduler定时执行外加supervisor管理后台运行
  7. 浅谈ASP.net处理XML数据
  8. Personal idea
  9. window环境下使用sbt编译spark源码
  10. 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛:Frequent Subsets Problem (状态压缩)