计算机网络课程设计,使用MFC实现界面化创建ARP发送与接受程序(四)
ARP发送程序相关函数设计及API调用:
- 界面初始化函数:
使用WINPCAP API获取本地适配器信息并传给界面的下拉框
//这里仅仅显示MFC对话框中界面初始化添加额外初始化代码的部分
CString str;
if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL /* auth is not needed */, &alldevs, errbuf) == -1)
{
str.Format("Error in pcap_findalldevs_ex: %s\n", errbuf);//将错误信息写入字符串中
m_com.AddString(str); //m_com是ComboBox的一个变量,变量类型为CComboBox
exit(1);
}
/* 打印列表 */
for (d = alldevs; d != NULL; d = d->next)
{
str.Format("%s", d->name); //将设备名称写入字符串中
m_com.AddString(str); //将字符串传入combobox进行显示并选择
}
m_com.SetCurSel(0); //默认选择第一项
运行结果如图:
由于使用WINPCAP获取的设备信息并不能让我们一眼知道我们想使用的适配器,在后面选择适配器发送时,可以逐一尝试。
利用WIN32 API中的 IP Helper给出的方法更直观的显示网卡的信息
PIP_ADAPTER_INFO pAdapter = 0;//这个在xxxdlg.cpp文件中最好定义为全局变量以供后面使用
DWORD opinf; //同上
opinf = GetAdaptersInfo(pAdapter, &uBuf);
if (opinf == ERROR_BUFFER_OVERFLOW)
{
pAdapter = (PIP_ADAPTER_INFO)GlobalAlloc(GPTR, uBuf);//获取本地所有适配器并赋值
pAdapterInf = pAdapter; //将适配器信息赋值,防止接下来出现错误
opinf = GetAdaptersInfo(pAdapter, &uBuf);//获取本地网络信息,并赋值返回值
if (opinf == ERROR_SUCCESS)
{
while (pAdapterInf)//当适配器信息不空
{
dev_inf.AddString(pAdapterInf->Description); //添加适配器信息至ComboBox中
pAdapterInf = pAdapterInf->Next; //继续下一个适配器
}
}
}
运行结果:
这里我们发现,适配器的名字更容易让我们理解,例如我的笔记本的网卡是Intel Wireless-AC 8265这款,那么后面我们就可以选择它作为发送的设备来发送ARP
这里我参考了CSDN上面的这篇文章:“MFC界面编程: 为 Arp协议获得本地局域网内在线主机MAC地址的程序 编写 界面”
如果你无法理解IP He