获取网卡地址.docx
- 文档编号:5748367
- 上传时间:2022-12-31
- 格式:DOCX
- 页数:28
- 大小:27.34KB
获取网卡地址.docx
《获取网卡地址.docx》由会员分享,可在线阅读,更多相关《获取网卡地址.docx(28页珍藏版)》请在冰豆网上搜索。
获取网卡地址
//Declareandinitializevariables
//Itispossibleforanadaptertohavemultiple
//IPv4addresses,gateways,andsecondaryWINSservers
//assignedtotheadapter.
//
//Notethatthissamplecodeonlyprintsoutthe
//firstentryfortheIPaddress/mask,andgateway,and
//theprimaryandsecondaryWINSserverforeachadapter.
CStringstrAdapterInfo,strTmp;
PIP_ADAPTER_INFOpAdapterInfo;
PIP_ADAPTER_INFOpAdapter=NULL;
DWORDdwRetVal=0;
UINTi;
//variablesusedtoprintDHCPtimeinfo
structtmnewtime;
charbuffer[32];
errno_terror;
ULONGulOutBufLen=sizeof(IP_ADAPTER_INFO);
pAdapterInfo=(IP_ADAPTER_INFO*)MALLOC(sizeof(IP_ADAPTER_INFO));
if(pAdapterInfo==NULL)
{
TRACE("ErrorallocatingmemoryneededtocallGetAdaptersinfo\n");
return;
}
//MakeaninitialcalltoGetAdaptersInfotoget
//thenecessarysizeintotheulOutBufLenvariable
if(GetAdaptersInfo(pAdapterInfo,&ulOutBufLen)==ERROR_BUFFER_OVERFLOW)
{
FREE(pAdapterInfo);
pAdapterInfo=(IP_ADAPTER_INFO*)MALLOC(ulOutBufLen);
if(pAdapterInfo==NULL)
{
TRACE("ErrorallocatingmemoryneededtocallGetAdaptersinfo\n");
return;
}
}
if((dwRetVal=GetAdaptersInfo(pAdapterInfo,&ulOutBufLen))==NO_ERROR)
{
pAdapter=pAdapterInfo;
CStringstrGroupName,strSubItemName,strSubItemValue,strSubItemDescr;
CBCGPProp*pNETGroup=newCBCGPProp(_T("网络信息"));
while(pAdapter)
{
USES_CONVERSION;
strTmp.Format(_T("序号:
%d\r\n"),pAdapter->ComboIndex);
strAdapterInfo+=strTmp;
strTmp.Format(_T("名称:
%s\r\n"),A2W(pAdapter->AdapterName));
strAdapterInfo+=strTmp;
strTmp.Format(_T("描述:
%s\r\n"),A2W(pAdapter->Description));
strAdapterInfo+=strTmp;
strGroupName=A2W(pAdapter->Description);
CBCGPProp*pGroup=newCBCGPProp(strGroupName);
pNETGroup->AddSubItem(pGroup);
strTmp=_T("地址:
");
strAdapterInfo+=strTmp;
strSubItemName=_T("MAC地址");
strSubItemValue.Empty();
for(i=0;i
{
if(i==(pAdapter->AddressLength-1))
strTmp.Format(_T("%.2X"),(int)pAdapter->Address[i]);
else
strTmp.Format(_T("%.2X-"),(int)pAdapter->Address[i]);
strAdapterInfo+=strTmp+_T("\r\n");
strSubItemValue+=strTmp;
}
strSubItemDescr=_T("网卡MAC地址(实际物理地址)");
pGroup->AddSubItem(newCBCGPProp(strSubItemName,(_variant_t)strSubItemValue,strSubItemDescr));
strTmp.Format(_T("索引:
%d\r\n"),pAdapter->Index);
strAdapterInfo+=strTmp;
strTmp=_T("类型:
");
strAdapterInfo+=strTmp;
switch(pAdapter->Type)
{
caseMIB_IF_TYPE_OTHER:
strTmp=_T("其它\r\n");
break;
caseMIB_IF_TYPE_ETHERNET:
strTmp=_T("以太网\r\n");
break;
caseMIB_IF_TYPE_TOKENRING:
strTmp=_T("令牌环\r\n");
break;
caseMIB_IF_TYPE_FDDI:
strTmp=_T("FDDI\r\n");
break;
caseMIB_IF_TYPE_PPP:
strTmp=_T("PPP\r\n");
break;
caseMIB_IF_TYPE_LOOPBACK:
strTmp=_T("回路\r\n");
break;
caseMIB_IF_TYPE_SLIP:
strTmp=_T("Slip\r\n");
break;
default:
strTmp.Format(_T("未知类型%ld\r\n"),pAdapter->Type);
break;
}
strAdapterInfo+=strTmp;
strSubItemName=_T("IP地址");
strSubItemValue=A2W(pAdapter->IpAddressList.IpAddress.String);
strSubItemDescr=_T("IP地址");
pGroup->AddSubItem(newCBCGPProp(strSubItemName,(_variant_t)strSubItemValue,strSubItemDescr));
strTmp.Format(_T("IP地址:
%s\r\n"),A2W(pAdapter->IpAddressList.IpAddress.String));
strAdapterInfo+=strTmp;
strSubItemName=_T("子网掩码");
strSubItemValue=A2W(pAdapter->IpAddressList.IpMask.String);
strSubItemDescr=_T("子网掩码");
pGroup->AddSubItem(newCBCGPProp(strSubItemName,(_variant_t)strSubItemValue,strSubItemDescr));
strTmp.Format(_T("子网掩码:
%s\r\n"),A2W(pAdapter->IpAddressList.IpMask.String));
strAdapterInfo+=strTmp;
strSubItemName=_T("网关地址");
strSubItemValue=A2W(pAdapter->GatewayList.IpAddress.String);
strSubItemDescr=_T("网关地址");
pGroup->AddSubItem(newCBCGPProp(strSubItemName,(_variant_t)strSubItemValue,strSubItemDescr));
strTmp.Format(_T("网关地址:
%s\r\n"),A2W(pAdapter->GatewayList.IpAddress.String));
strAdapterInfo+=strTmp;
strTmp=_T("***\r\n");
strAdapterInfo+=strTmp;
if(pAdapter->DhcpEnabled)
{
CStringstrStart,strEnd;
strTmp=_T("DHCP:
是\r\n");
strAdapterInfo+=strTmp;
strTmp.Format(_T("DHCP服务器:
%s\r\n"),A2W(pAdapter->DhcpServer.IpAddress.String));
strAdapterInfo+=strTmp;
strTmp=_T("租约时间:
");
strAdapterInfo+=strTmp;
//Displaylocaltime
error=_localtime32_s(&newtime,(const__time32_t*)&pAdapter->LeaseObtained);
if(error)
TRACE("InvalidArgumentto_localtime32_s\n");
else
{
//ConverttoanASCIIrepresentation
strftime(buffer,_countof(buffer),"%Y-%m-%d%H:
%M:
%S",&newtime);
//error=asctime_s(buffer,32,&newtime);
//if(error)
//TRACE("InvalidArgumenttoasctime_s\n");
//else
{
//asctime_sreturnsthestringterminatedby\n\0
strTmp.Format(_T("%s\r\n"),A2W(buffer));
strStart=A2W(buffer);
strAdapterInfo+=strTmp;
}
}
strTmp=_T("到期时间:
");
strAdapterInfo+=strTmp;
if(pAdapter->LeaseExpires==0)
{
//time_tspantime=912395715;
//time_tts=:
:
mktime(&newtime);
//time_tlasttime=spantime+ts;
//structtmlasttm;
//error=localtime_s(&lasttm,&lasttime);
//if(error)
//TRACE("InvalidArgumentto_localtime32_s\n");
//else
{
//strftime(buffer,_countof(buffer),"%Y-%m-%d%H:
%M:
%S",&lasttm);
//strTmp.Format(_T("%s(无限期,静态分配)\r\n"),A2W(buffer));
//strEnd=A2W(buffer);
//strEnd+=_T("(无限期,静态分配)");
strTmp=_T("(无限期,静态分配)\r\n");
strEnd=_T("(无限期,静态分配)");
//strAdapterInfo+=strTmp;
}
}
else
{
error=_localtime32_s(&newtime,(const__time32_t*)&pAdapter->LeaseExpires);
if(error)
TRACE("InvalidArgumentto_localtime32_s\n");
else
{
//ConverttoanASCIIrepresentation
strftime(buffer,_countof(buffer),"%Y-%m-%d%H:
%M:
%S",&newtime);
//error=asctime_s(buffer,32,&newtime);
//if(error)
//TRACE("InvalidArgumenttoasctime_s\n");
//else
{
//asctime_sreturnsthestringterminatedby\n\0
strTmp.Format(_T("%s\r\n"),A2W(buffer));
strEnd=A2W(buffer);
strAdapterInfo+=strTmp;
}
}
}
CBCGPProp*pDHCP=newCBCGPProp(_T("DHCP"),0,TRUE);
CBCGPProp*pDHCPDetailProp=newCBCGPProp(_T("DHCP服务器"),(_variant_t)A2W(pAdapter->DhcpServer.IpAddress.String),_T("DHCP服务器"));
pDHCP->AddSubItem(pDHCPDetailProp);
pDHCPDetailProp=newCBCGPProp(_T("租约时间"),(_variant_t)strStart,_T("租约时间"));
pDHCP->AddSubItem(pDHCPDetailProp);
pDHCPDetailProp=newCBCGPProp(_T("到期时间"),(_variant_t)strEnd,_T("到期时间"));
pDHCP->AddSubItem(pDHCPDetailProp);
pGroup->AddSubItem(pDHCP);
}
else
{
strTmp=_T("DHCP:
否\r\n");
strAdapterInfo+=strTmp;
CBCGPProp*pDHCP=newCBCGPProp(_T("DHCP"),0,TRUE);
pDHCP->AddSubItem(newCBCGPProp(_T("DHCP"),(_variant_t)false,_T("DHCP")));
pGroup->AddSubItem(pDHCP);
}
if(pAdapter->HaveWins)
{
strTmp=_T("WINS:
是\r\n");
strAdapterInfo+=strTmp;
strTmp.Format(_T("主WINS服务器:
%s\r\n"),A2W(pAdapter->PrimaryWinsServer.IpAddress.String));
strAdapterInfo+=strTmp;
strTmp.Format(_T("辅WINS服务器:
%s\r\n"),A2W(pAdapter->SecondaryWinsServer.IpAddress.String));
strAdapterInfo+=strTmp;
CBCGPProp*pWINS=newCBCGPProp(_T("WINS"),0,TRUE);
CBCGPProp*pWINSDetailProp=newCBCGPProp(_T("主服务器"),(_variant_t)A2W(pAdapter->PrimaryWinsServer.IpAddress.String),_T("主WINS服务器"));
pWINS->AddSubItem(pWINSDetailProp);
pWINSDetailProp=newCBCGPProp(_T("辅服务器"),(_variant_t)A2W(pAdapter->SecondaryWinsServer.IpAddress.String),_T("辅WINS服务器"));
pWINS->AddSubItem(pWINSDetailProp);
pGroup->AddSubItem(pWINS);
}
else
{
strTmp=_T("WINS:
否\r\n");
strAdapterInfo+=strTmp;
CBCGPProp*pWINS=newCBCGPProp(_T("WINS"),0,TRUE);
pWINS->AddSubItem(newCBCGPProp(_T("WINS"),(_variant_t)false,_T("WINS")));
pGroup->AddSubItem(pWINS);
}
pAdapter=pAdapter->Next;
strAdapterInfo+=_T("\r\n");
}
m_wndOtherInfoPropList.AddProperty(pNETGroup);
}
else
{
TRACE("GetAdaptersInfofailedwitherror:
%d\n",dwRetVal);
return;
}
if(pAdapterInfo)
FREE(pAdapterInfo);
//StringCchCopy(szAdapter,BUFSIZE,strAdapterInfo);
return;
IPHelperAPI简介2
2009-01-0614:
29:
55| 分类:
IP地址| 标签:
|字号大中小 订阅
IPHelper是一套用于管理本地网络设置的API(应用程序编程接口)它的功能十分强大,通过使用这一套API,你可以方便的改变计算机的网络设置或者提取有关的信息。
而且它还提供了一种消息机制,能够在本地计算机的网络设置发生改变时通知你的应用程序。
也就是说以前设置IP,掩码等等另人难以入眠的种种烦琐的工作现在都可以轻松搞定了。
而且实际上,它不仅仅能够提取本机的网络设置信息,还能够获得网络上其它计算机的IP使用情况和MAC地址。
这正是后面另一篇文章的例子程序中要使用的功能。
哪儿可以搞到IPHelperAPI?
Windows98以上的所有操作系统在系统目录的system32下都带有iphlpapi.dll这个库文件,而且对于NT4.0在加装了ServicePack2以后也就有了这个库文件。
这只能说明我们的程序可以在这些系统上运行而不需要额外的库文件,但是对于C程序员来说还必须有相应的头文件等等东西。
这个东东网上不太多,在华中理工和清华9#的FTP上有它的头文件,文件很小,只有几K(头文件而已,大不到哪儿去)。
当然,你也可以问微软要,下载SDK或者是定购SDK光盘(这是我梦想的事情)。
最后是对MSDN的一个勘误:
MSDN所声称的静态链接库iphlpapi.lib是不存在的(至少我没有找到),还是老老实实的使用动态库吧。
从最简单的开始
最简单的当然是看看我们计算机上的网络设置是什么而不要动手修改。
附表中列出了一个简单的网络设置查看程序,在这个程序中我分类使用了主要的API函数,为了交代问题而不让你陷入到MFC的汪洋大海中去,我把它做成了控制台界面的,而且做了详尽的注释,你可以把其中的代码剪切粘贴下来在任何地方使用。
让我来解释一下这些代码:
提取网卡信息
hInst=LoadLibrary("iphlpapi.dll");
if(!
hInst)
cout<<"iphlpapi.dllnotsupportedinthisplatform!
\n";
这三行代码的作用是加载iphlpapi库文件,在极个别的情况下,你使用了win95以下的操作系统或者不小心删除了iphlpapi.dll,第三行的语句才会被打印出来,这也是程序失败的唯一原因。
希望你还记得如何使用.dll。
长久以来我们一直都在幸福的使用着VC的静态链接库,在没有静态链接库的情况下我们还有傻瓜化的控件。
下面的几行代码显示了调用DLL中函数的过程:
pGAInfo=(PGAINFO)GetProcAddress(hInst,"GetAdaptersInfo");
ULONGulSize=0;
pGAInfo(pInfo,&ulSize);
pInfo=(PIP_ADAPTER_INFO)new(char[ulSize]);
pGAInfo(pInfo,&ulSize);
第一行代码是获得函数GetAdaptersInfo的入口地址,以便我们在后面通过指针调用函数。
这个函数的功能是提取网卡的信息,并接收两个参数,第一个参数是用来保存网卡信息的内存缓冲的首地址,而第二个参数是这个缓冲的大小。
但上面的代码看起来有些奇怪对么?
由于我们事先不知道本地机器上有多少张网卡,所以也就没法知道应该分配多大的缓存。
好在GetAdaptersInfo函数在缓冲的大小不够时会在第二个参数也就是ulSize中填入应该分配的缓冲的大小。
这样,我们就可以调用两次GetAdaptersInfo,第一次是获取缓冲区的大小,然后分配这个缓冲以后再次调用它以获得实际的网卡信息。
令人不解的是,GetAdaptersInfo通过pInfo返回的信息竟然是以静态链表的方式组织的,下面就是访问链表的代码:
while(pInfo)
{
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
//访问网卡数据
//将当前
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 获取 网卡 地址