这一节是程序的核心,也是最复杂的地方

首先需要明白的一点是,一般对于一个有界面的程序来说,往往需要多线程。本程序中除了界面线程外,抓包需要另外创建一个新的线程。在写抓包函数之前,首先要将前面两个模块的结果返回到主对话框界面对应的类实现中,在SnifferDlg.cpp中,修改之前增加的两个模块的触发函数如下:

 void CSnifferDlg::OnAdp()
{
// TODO: 在此添加命令处理程序代码
CAdpDlg adpdlg;
if(adpdlg.DoModal() == IDOK)
{
m_pDevice = adpdlg.returnd();
}
}
 void CSnifferDlg::OnFilter()
{
// TODO: 在此添加命令处理程序代码
CFilterDlg filterdlg;
if(filterdlg.DoModal() == IDOK)
{
int len =WideCharToMultiByte(CP_ACP,,filterdlg.GetFilterName(),-,NULL,,NULL,NULL);
WideCharToMultiByte(CP_ACP,,filterdlg.GetFilterName(),-,m_filtername,len,NULL,NULL ); }
}

前一个函数是在打开选择适配器窗口后,在用户选择完网卡后,将选择的网卡返回到主界面的类实现中;后一个函数是在打开设置过滤规则后,将过滤规则的字符串返回到主界面的类实现中。也许你对第二个函数中的两个函数不太明白,这是一个宽字符转换为多字符的函数,就只需了解其中两个参数即可,其它的复制粘贴,函数是这样使用的。获得了前两个模块的返回值,就可以来写抓包函数了,创建一个新线程,抓包函数代码如下:

 DWORD WINAPI CapturePacket(LPVOID lpParam)
{
CSnifferDlg *pDlg = (CSnifferDlg *)lpParam;
pcap_t *pCap;
char strErrorBuf[PCAP_ERRBUF_SIZE];
int res;
struct pcap_pkthdr *pkt_header;
const u_char *pkt_data;
u_int netmask;
struct bpf_program fcode; if((pCap=pcap_open_live(pDlg->m_pDevice->name,,PCAP_OPENFLAG_PROMISCUOUS,,strErrorBuf))==NULL)
{
return -;
} if(pDlg->m_pDevice->addresses != NULL)
/* 获得接口第一个地址的掩码 */
netmask=((struct sockaddr_in *)(pDlg->m_pDevice->addresses->netmask))->sin_addr.S_un.S_addr;
else
/* 如果接口没有地址,那么我们假设一个C类的掩码 */
netmask=0xffffff;
//编译过滤器
if (pcap_compile(pCap, &fcode,pDlg->m_filtername, , netmask) < )
{
AfxMessageBox(_T("请设置过滤规则"));
return -;
}
//设置过滤器
if (pcap_setfilter(pCap, &fcode)<)
return -; while((res = pcap_next_ex( pCap, &pkt_header, &pkt_data)) >= )
{ if(res == )
continue;
if(!pDlg->m_bFlag)
break;
CSnifferDlg *pDlg = (CSnifferDlg *)AfxGetApp()->GetMainWnd();
pDlg->ShowPacketList(pkt_header,pkt_data);
pDlg = NULL;
} pcap_close(pCap);
pDlg = NULL;
return ;
}

解释两个地方,一是怎样控制开始抓包和停止抓包,这里采用了一个bool变量m_bFlag,这个变量初值是FALSE,当点击菜单中的开始捕获变量为true,点击停止捕获变量又变为false。二是当抓完一个包后,又将指针指向主界面的句柄,之后将抓来的数据包的内容在主界面中显示。

主界面中有三个需要显示抓包内容的地方,一是数据包的概略信息,用ShowPacketList函数来实现;二是数据包的详细信息用ShowPacketTree函数来实现;三是数据包的具体内容和统计信息。这三部分是大量相似的代码,主要涉及到对网络协议的分析,用到的主要是判断语句,放到下一节讲吧。

下一节 MFC+WinPcap编写一个嗅探器之七(协议)

MFC+WinPcap编写一个嗅探器之六(分析模块)的更多相关文章

  1. MFC+WinPcap编写一个嗅探器之五(过滤模块)

    这一节主要介绍如何获设置捕获过滤,这里的过滤是指在捕获前过滤 设置捕获过滤主要是在CFilterDlg中完成,也就是对应之前创建的设置过滤规则对话框,如图: 首先要根据用户的选择来生成一个合法的过滤规 ...

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

    这一节主要介绍如何获取设备列表,比较简单 获取设备列表主要是在CAdpDlg中完成,也就是对应之前创建的选择适配器模块,如图: 当打开选择适配器对话框后,在列表视图控件中显示当前主机所有适配器及适配器 ...

  3. MFC+WinPcap编写一个嗅探器之三(WinPcap)

    介绍程序模块前,这一节再复习一下WinPcap WinPcap开发一个嗅探器的主要步骤如下: (1)获取嗅探设备 WinPcap提供了pcap_findalldevs_ex() 函数来实现这个功能: ...

  4. MFC+WinPcap编写一个嗅探器之一(准备)

    知识准备: MFC:http://www.jizhuomi.com/software/257.html WinPcap:http://www.ferrisxu.com/WinPcap/html/ind ...

  5. MFC+WinPcap编写一个嗅探器之七(协议)

    这一节是本系列教程的结尾了,内容也比较简单,主要是对网络协议进行分析,其实学过计算机网络的同学完全可以略过 在整个项目中需要有一个头文件存放各层协议的头部定义,我把它们放在了head.h中,这个头文件 ...

  6. MFC+WinPcap编写一个嗅探器之零(目录)

    零零散散写了三天,完成了编写嗅探器的文章,旨在让自己加深印象,是初学者少走一些弯路.因为先前未接触MFC,之后也不打算精通,完全是0基础,所以文章技术含量不高,但难点基本上都都包括了,凑合这看吧,接下 ...

  7. MFC+WinPcap编写一个嗅探器之二(界面)

    选择新建->项目->MFC应用程序->基于对话框完成,这里文件名为sniffer 打开资源视图中的Dialog列表,打开项目总默认创建的话框,将对话框中的所有控件删除,之后按照最终效 ...

  8. 从头开始编写一个Orchard网上商店模块(6) - 创建购物车服务和控制器

    原文地址: http://skywalkersoftwaredevelopment.net/blog/writing-an-orchard-webshop-module-from-scratch-pa ...

  9. 从头开始编写一个Orchard网上商店模块(5) - 创建和渲染ProductCatalog的内容类型

    原文地址: http://skywalkersoftwaredevelopment.net/blog/writing-an-orchard-webshop-module-from-scratch-pa ...

随机推荐

  1. java基础-Map集合

    java基础-Map集合 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Map集合概述 我们通过查看Map接口描述,发现Map接口下的集合与Collection接口下的集合,它 ...

  2. 转:实现OC与JS的简易交互

    oc-->js stringByEvaluatingJavaScriptFromString,其参数是一NSString 字符串内容是js代码(这又可以是一个js函数.一句js代码或他们的组合) ...

  3. COGS 513 八

    513. 八 http://www.cogs.pro/cogs/problem/problem.php?pid=513 ★☆   输入文件:eight.in   输出文件:eight.out   简单 ...

  4. [SDOI2016 Round1] 数字配对

    COGS 2221. [SDOI2016 Round1] 数字配对 http://www.cogs.pro/cogs/problem/problem.php?pid=2221 ★★★   输入文件:m ...

  5. Android端抓取日志

    一.背景: ADT-Bundlee for Windows 是由GoogleAndroid官方提供的集成式IDE,已经包含了Eclipse,你无需再去下载Eclipse,并且里面已集成了插件,它解决大 ...

  6. 单进程单线程的Redis如何能够高并发

    redis快的原因: 1.纯内存操作2.异步非阻塞 IO 参考文档: (1)http://yaocoder.blog.51cto.com/2668309/888374 (2)http://www.cn ...

  7. div+css+jQuery简单实现投票功能

    昨天看到C#群里有人问一个投票功能如何实现... 我对此很感兴趣,为了练习一下,就有了以下代码. 投票功能使用jQuery实现..纯html代码...数据通过json字符串传递,通过 eval转换为j ...

  8. 学号20155308 2016-2017-2 《Java程序设计》第5周学习总结

    学号20155308 2016-2017-2 <Java程序设计>第5周学习总结 教材学习内容总结 8.1 语法与继承架构 使用try...catch 注意多个catch一定把父类放后面 ...

  9. CF264B Good Sequences

    传送门 Description: 松鼠丽丝特别喜欢n个她称之为“好整数”的整数:a1,a2,……,an.(会输入) 现在,她对“好序列”很感兴趣.如果一个序列x1,x2,...,xk能够满足一下三个条 ...

  10. 25、LinkedList特有方法

    LinkedList特有方法 public void addFirst(E e)及addLast(E e) public E getFirst()及getLast() public E removeF ...