zoukankan      html  css  js  c++  java
  • MFC+WinPcap编写一个嗅探器之四(获取模块)

    这一节主要介绍如何获取设备列表,比较简单

    获取设备列表主要是在CAdpDlg中完成,也就是对应之前创建的选择适配器模块,如图:

    当打开选择适配器对话框后,在列表视图控件中显示当前主机所有适配器及适配器的描述,当选中一个适配器时,在下方的编辑框中会显示当前选中的适配器,单击绑定会提示网卡绑定成功。

    本节中代码都在AdpDlg.cpp中完成,当然变量的声明要在其对应的头文件中去做,这里就不再叙述。

    首先要获取设备列表,在OnInitDialog函数中加入如下代码:

    1 if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &alldevs, errbuf) == -1)
    2         return FALSE;

    这样主机上的所有设备就放入alldevs这个链表中,我们将链表中的每个设备依次输出到列表视图控件中去:

    1 for(d=alldevs; d; d=d->next)
    2     {
    3         m_list1.InsertItem(0,(CString)d->name);        //d->name的类型是char *,需要强制转换为CString才能在InsertItem中显示
    4         m_list1.SetItemText(0,1,(CString)d->description);
    5     }
    6     d = NULL; //清空以便其他函数使用

    注意在MFC中不接受char类型的字符串变量,所有字符串变量应该是用CString类型,类似与C++中的string类型。接下来我们想要在列表视图控件中选择一个设备,然后在下面的编辑框中显示,这时需要列表视图控件的一个触发函数。在属性也中选择对应列表视图空间的属性,选择控制事件(闪电),然后找到NM_CLICK,点击一下就会生成函数,在函数中添加如下代码:

     1 void CAdpDlg::OnNMClickList1(NMHDR *pNMHDR, LRESULT *pResult)
     2 {
     3     LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
     4     // TODO: 在此添加控件通知处理程序代码
     5     *pResult = 0;
     6 
     7        
     8     NMLISTVIEW *pNMListView = (NMLISTVIEW*)pNMHDR;   
     9 
    10     if (-1 != pNMListView->iItem)        // 如果iItem不是-1,就说明有列表项被选择   
    11     {   
    12         // 获取被选择列表项第一个子项的文本   
    13         adpname = m_list1.GetItemText(pNMListView->iItem, 0);   
    14         // 将选择的语言显示与编辑框中   
    15         SetDlgItemText(IDC_EDIT1, adpname);   
    16     }   
    17 }

    之后根据用户的选择返回获取的设备:

     1 //返回已选中设备
     2 pcap_if_t* CAdpDlg::GetDevice()
     3 {
     4     if(adpname)
     5     {
     6         for(d=alldevs; d; d=d->next)
     7             if(d->name == adpname)
     8                 return d;
     9     }
    10     return NULL;
    11 }

    单击绑定时检查是否合法:

     1 void CAdpDlg::OnBnClickedOk()
     2 {
     3     // TODO: 在此添加控件通知处理程序代码
     4     d = GetDevice();
     5     if(d)
     6     {
     7         MessageBox(_T("网卡绑定成功!"));
     8         CDialogEx::OnOK();
     9     }
    10     else
    11         MessageBox(_T("请选择要绑定的网卡"));
    12 }

     这样获取模块就完成的差不多了

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

  • 相关阅读:
    hystrix 源码分析以及属性的配置
    golang官方包限流器使用和原理(golang.org/x/time/rate)
    pip通过指定分支和子目录从git仓库中拉取python包
    cgo使用示例总结
    python装饰器原理和用法总结
    centos7编译安装clang8(同时还会编译llvm的不少东西, 文中附带编译好的二进制压缩包)
    prometheus+alertmanager+granafa监控总结,安装基于docker-compose(长期更新)
    go条件变量的使用和原理
    canal+kafka订阅Mysql binlog将数据异构到elasticsearch(或其他存储方式)
    go对elasticsearch的增删改查
  • 原文地址:https://www.cnblogs.com/raichen/p/4133108.html
Copyright © 2011-2022 走看看