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编写一个嗅探器之五(过滤模块)