熟悉WinpCap(二):获取已安装设备的高级信息
写在前面:参考 http://www.coffeecat.net.cn/winpcap,最近在接触和熟悉WinpCap,并参考原来的代码,改写为VC6.0 环境的对话框工程,方便自己日后的使用,在此分享出来,希望能帮助一些需要熟悉WinpCap的朋友!
在第1讲中, ( 获取设备列表) 我们展示了如何获取适配器的基本信息 (如设备的名称和描述)。 事实上,WinPcap提供了其他更高级的信息。 特别需要指出的是, 由 pcap_findalldevs() 返回的每一个 pcap_if 结构体,都包含一个 pcap_addr 结构体,这个结构体由如下元素组成:
- 一个地址列表
- 一个掩码列表 (each of which corresponds to an entry in the addresses list).
- 一个广播地址列表 (each of which corresponds to an entry in the addresses list).
- 一个目的地址列表 (each of which corresponds to an entry in the addresses list).
另外,函数 pcap_findalldevs() 还能返回远程适配器信息和一个位于所给的本地文件夹的pcap文件列表。
主要函数代码
//
获取所有信息
void CGetInfoDlg::GetInfo(pcap_if_t * Dev)
{
pcap_addr_t *pAddr_t;
//char ip6str[128];
CString strInfo;
// 设备名(Name)
strInfo.Format("%s",Dev->name);
AfxMessageBox(strInfo);
//设备描述(Description)
strInfo.Format("%s",Dev->description);
AfxMessageBox(strInfo);
//Loopback Address
strInfo.Format("%s",(Dev->flags & PCAP_IF_LOOPBACK)? "YES": "NO");
AfxMessageBox(strInfo);
//IP Addresses
for(pAddr_t = Dev->addresses;pAddr_t;pAddr_t=pAddr_t->next)
{
strInfo.Format("Address Family:#%d",pAddr_t->addr->sa_family);
AfxMessageBox(strInfo);
switch(pAddr_t->addr->sa_family)
{
case AF_INET:
strInfo.Format("Address Family Name: AF_INET");
if(pAddr_t->addr)
{ // sockaddr_in* sa = (struct sockaddr_in*)Addr->addr;
strInfo.Format("Address: %s",inet_ntoa(((struct sockaddr_in*)pAddr_t->addr)->sin_addr));
AfxMessageBox(strInfo);
}
if(pAddr_t->netmask)
{
strInfo.Format("Netmask: %s",inet_ntoa(((struct sockaddr_in*)pAddr_t->netmask)->sin_addr));
AfxMessageBox(strInfo);
}
if(pAddr_t->broadaddr)
{
strInfo.Format("Broadcast Address: %s",inet_ntoa(((struct sockaddr_in*)pAddr_t->broadaddr)->sin_addr));
AfxMessageBox(strInfo);
}
if(pAddr_t->dstaddr)
{
strInfo.Format("Destination Address: %s",inet_ntoa(((struct sockaddr_in*)pAddr_t->dstaddr)->sin_addr));
AfxMessageBox(strInfo);
}
break;
case AF_INET6:
strInfo.Format("Address Family Name: AF_INET6");
AfxMessageBox(strInfo);
// if(pAddr_t->addr)
// strInfo.Format("Address: %s",ip6tos(pAddr_t->addr, ip6str, sizeof(ip6str)));
break;
default:
strInfo = "Address Family Name: Unknown";
AfxMessageBox(strInfo);
break;
}
}
}
void CGetInfoDlg::GetInfo(pcap_if_t * Dev)
{
pcap_addr_t *pAddr_t;
//char ip6str[128];
CString strInfo;
// 设备名(Name)
strInfo.Format("%s",Dev->name);
AfxMessageBox(strInfo);
//设备描述(Description)
strInfo.Format("%s",Dev->description);
AfxMessageBox(strInfo);
//Loopback Address
strInfo.Format("%s",(Dev->flags & PCAP_IF_LOOPBACK)? "YES": "NO");
AfxMessageBox(strInfo);
//IP Addresses
for(pAddr_t = Dev->addresses;pAddr_t;pAddr_t=pAddr_t->next)
{
strInfo.Format("Address Family:#%d",pAddr_t->addr->sa_family);
AfxMessageBox(strInfo);
switch(pAddr_t->addr->sa_family)
{
case AF_INET:
strInfo.Format("Address Family Name: AF_INET");
if(pAddr_t->addr)
{ // sockaddr_in* sa = (struct sockaddr_in*)Addr->addr;
strInfo.Format("Address: %s",inet_ntoa(((struct sockaddr_in*)pAddr_t->addr)->sin_addr));
AfxMessageBox(strInfo);
}
if(pAddr_t->netmask)
{
strInfo.Format("Netmask: %s",inet_ntoa(((struct sockaddr_in*)pAddr_t->netmask)->sin_addr));
AfxMessageBox(strInfo);
}
if(pAddr_t->broadaddr)
{
strInfo.Format("Broadcast Address: %s",inet_ntoa(((struct sockaddr_in*)pAddr_t->broadaddr)->sin_addr));
AfxMessageBox(strInfo);
}
if(pAddr_t->dstaddr)
{
strInfo.Format("Destination Address: %s",inet_ntoa(((struct sockaddr_in*)pAddr_t->dstaddr)->sin_addr));
AfxMessageBox(strInfo);
}
break;
case AF_INET6:
strInfo.Format("Address Family Name: AF_INET6");
AfxMessageBox(strInfo);
// if(pAddr_t->addr)
// strInfo.Format("Address: %s",ip6tos(pAddr_t->addr, ip6str, sizeof(ip6str)));
break;
default:
strInfo = "Address Family Name: Unknown";
AfxMessageBox(strInfo);
break;
}
}
}
//
获取设备,并获取设备的信息
void CGetInfoDlg::FindAllDevs()
{
int i=0;
char errBuf[PCAP_ERRBUF_SIZE];
CString strErr;
CString strDev;
//获取本机设备列表
if(pcap_findalldevs(&AllDevs,errBuf) == -1)
{
strErr.Format("Error in pcap_findalldevs_ex: %s",errBuf);
AfxMessageBox(strErr);
return;
}
//打印列表
for(Dev=AllDevs; Dev!=NULL; Dev = Dev->next)
{
GetInfo(Dev); //获取信息
}
//不再需要设备列表了,释放它
pcap_freealldevs(AllDevs);
}
VC6.0工程代码: /Files/Lee7/GetInfo.rar
void CGetInfoDlg::FindAllDevs()
{
int i=0;
char errBuf[PCAP_ERRBUF_SIZE];
CString strErr;
CString strDev;
//获取本机设备列表
if(pcap_findalldevs(&AllDevs,errBuf) == -1)
{
strErr.Format("Error in pcap_findalldevs_ex: %s",errBuf);
AfxMessageBox(strErr);
return;
}
//打印列表
for(Dev=AllDevs; Dev!=NULL; Dev = Dev->next)
{
GetInfo(Dev); //获取信息
}
//不再需要设备列表了,释放它
pcap_freealldevs(AllDevs);
}