一步一步开发sniffer(Winpcap+MFC)(二)掀起你的盖头来,让我来画你的脸——用MFC开发GUI

         书接上回,由于前段时间较忙,都没心思来写这个了,两章之间的间隔有点久了,后来……*&&……%*&……发生了很多事,又重装了系统,还重装了VS,现在是VS2010,前面说的是基于VS2008的,但是没关系,二者大同小异,没太大差别,不影响理解,有不便的请原谅(不想再装VS2008了,装一次要好久- -!

         扯多了,进入正题,本节主题是写GUI,下面开始。 

         第一步,打开VS,新建工程,选择“MFC应用程序”,如下图:

     

         输入工程名,我这里命名为lixsniff,其他的没什么了,点击“确定”,进入下面这个画面,选择“基于对话框(再多解释下,“单文档”、“多个文档”是应用于多窗口之类较为复杂的界面,我们这个程序很简单,在一个界面上就完成所有的事,所以就先最简单的“基于对话框”

   

 

         其他的没什么,点击“完成”,进入下面的画面,可以看到画面中间,写有“TODO:在此放置对话框控件”的窗口,这就是我们要画的GUI的底板啦:

                 

         下面把这个“底板”适当的调整一下大小,直接用鼠标拖就行了,选中按delete把默认生成的“确定”和“取消”按钮删了,我们用不着,结果如下图:

              

         MFCGUI非常的方便,直接在控件库里拖动就行了,下面按照上一节最开始看到的最终效果图来一步一步添加控件,点击右侧的“工具箱”,可以看到有很多可供选择,如下图:

    

         第一步,添加下拉列表,点击“工具箱”,选择“combo box”,在“底板”上拖动,增添一个合适长宽的控件,然后右键点击此控件,选择“属性”,在“外观-Type”栏中选择“DropList”,再复制粘贴一个此控件,整体情况,如下图:

    

         下一步,添加四个按钮:开始、结束、保存、读取。点击“工具箱”中的“button”,在“底板”增添一个适当大小的的按钮,点击此按钮,把“外观-Caption”修改为“开始”,这样,按钮上的文字就被设置为“开始”了,其他三个按钮方法相同,结果如下:

       

        第三步,添加列表,用来显示接受到的包信息,点击“工具箱”,选择“List Control”,添加一个适当大小的列表框控件,设置其属性,“外观-View”项设置为“Report”,“外观-single selection”设置为“true”,如下图:

     

第四步,添加树形列表,显示每一个包的具体字段信息,点击“工具箱”,选择“Tree Control”,添加一个合适大小树形列表控件,将其“属性”中的“外观”下面的“Full Row Select”、“Has Buttons”、“Info Tip”、“Lines At Root”均设置为“True”,如下图:

 

第五步,添加文本框,显示数据包的二进制信息,添加一个合适大小的“Edit Control”,将“Multiline”、“Readonly”、“Auto Vscroll”、“Horizon Scroll”、“Vertical Scroll”均设置为“True”,如下图:

 

最后,再添加若干适当大小“Edit Control”及“Static Text”,用于显示,并添加一个“Group Box”它们包围起来,具体步骤就不详述了,见下图:

 

至此为止,所有的GUI算是画完了,表面上是完成了,但是实际上还有些数据及属性的设置需要通过后台对相应的控件来完成,如何实现这一点,将在最后一章“千呼万唤始出来,不抱琵琶也露面——将解析数据写到GUI上”详细阐述。

    下一章得广厦千万间,先画蓝图再砌砖——搭建winpcap抓包框架”将进入最核心的编程,使用winpcap搭建起一个抓包框架。

  • 10
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
以下是基于MFC+WinPcap的网络嗅探器的实现步骤: 1. 创建MFC对话框应用程序。 2. 下载和安装WinPcap库,并将其添加到项目中。 3. 在对话框中添加一个列表框控件,用于显示捕获到的数据包。 4. 在对话框头文件中包含WinPcap库的头文件pcap.h,并定义一个pcap_t类型的变量用于打开网络适配器。 5. 在OnInitDialog()函数中初始化WinPcap库,并打开网络适配器。 6. 创建一个线程来捕获数据包,在线程函数中使用pcap_loop()函数来持续捕获数据包,并将捕获到的数据包添加到列表框中。 7. 在OnDestroy()函数中关闭网络适配器和WinPcap库。 以下是基于MFC+WinPcap的网络嗅探器的代码示例: ```cpp #include "stdafx.h" #include "MySnifferDlg.h" #include "afxdialogex.h" #include <pcap.h> #ifdef _DEBUG #define new DEBUG_NEW #endif // CMySnifferDlg 对话框 CMySnifferDlg::CMySnifferDlg(CWnd* pParent /*=nullptr*/) : CDialogEx(IDD_MYSNIFFER_DIALOG, pParent) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CMySnifferDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); DDX_Control(pDX, IDC_LIST_PACKETS, m_listPackets); } BEGIN_MESSAGE_MAP(CMySnifferDlg, CDialogEx) ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_WM_DESTROY() END_MESSAGE_MAP() // CMySnifferDlg 消息处理程序 BOOL CMySnifferDlg::OnInitDialog() { CDialogEx::OnInitDialog(); // 将“关于...”菜单项添加到系统菜单中。 // IDM_ABOUTBOX 必须在系统命令范围内。 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != nullptr) { CString strAboutMenu; strAboutMenu.LoadString(IDS_ABOUTBOX); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动 // 执行此操作 SetIcon(m_hIcon, TRUE); // 设置大图标 SetIcon(m_hIcon, FALSE); // 设置小图标 // TODO: 在此添加额外的初始化代码 // 初始化WinPcap库 char errbuf[PCAP_ERRBUF_SIZE]; pcap_t* pcapHandle = pcap_open_live("\\Device\\NPF_{E908B419-FF05-408B-B4F6-8E82FBC3D16D}", // 网络适配器名称 65536, // 数据包最大长度 1, // 混杂模式 1000, // 超时时间(毫秒) errbuf); // 错误信息缓冲区 if (pcapHandle == NULL) { AfxMessageBox(_T("打开网络适配器失败!")); return TRUE; } // 开始捕获数据包 AfxBeginThread(CaptureThreadProc, (LPVOID)pcapHandle); return TRUE; // 除非将焦点设置到控件,否则返回 TRUE } void CMySnifferDlg::OnDestroy() { CDialogEx::OnDestroy(); // TODO: 在此处添加消息处理程序代码 // 关闭WinPcap库和网络适配器 pcap_t* pcapHandle = (pcap_t*)GetWindowLongPtr(GetSafeHwnd(), GWLP_USERDATA); pcap_close(pcapHandle); } void CMySnifferDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // 用于绘制的设备上下文 SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0); // 使图标在工作区矩形中居中 int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // 绘制图标 dc.DrawIcon(x, y, m_hIcon); } else { CDialogEx::OnPaint(); } } HCURSOR CMySnifferDlg::OnQueryDragIcon() { return static_cast<HCURSOR>(m_hIcon); } UINT CMySnifferDlg::CaptureThreadProc(LPVOID lpParam) { pcap_t* pcapHandle = (pcap_t*)lpParam; // 定义捕获数据包时的回调函数 void packetHandler(u_char* userData, const struct pcap_pkthdr* pkthdr, const u_char* packetData) { CMySnifferDlg* pThis = (CMySnifferDlg*)userData; // 将捕获到的数据包添加到列表框中 CString strPacket; strPacket.Format(_T("Packet size: %d bytes"), pkthdr->len); pThis->m_listPackets.AddString(strPacket); } // 开始捕获数据包 pcap_loop(pcapHandle, 0, packetHandler, (u_char*)AfxGetApp()->m_pMainWnd); return 0; } ``` 注意:上述代码中的网络适配器名称需要根据实际情况修改。可以使用WinPcap提供的pcap_findalldevs()函数来获取可用的网络适配器列表。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值