一台机器上可能不只有一个网卡,但每一个网卡只有一个MAC地址,而每一个网卡可能配置有多个IP地址;如平常的笔记本电脑中,就会有无线网卡和有线网卡(网线接口)两种;因此,如果要获得本机所有网卡的IP和MAC地址信息,则必须顺序获得每个网卡,再依次获取其信息等;在windows sdk中,用IP_ADAPTER_INFO结构体存储网卡信息,包括网卡名、网卡描述、网卡MAC地址、网卡IP等,代码实现很简单,看例子(VS2010下编译):
// WindConsole.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include #include #include using namespace std; #pragma comment(lib,"Iphlpapi.lib") //需要添加Iphlpapi.lib库 int _tmain(int argc, _TCHAR* argv[]) { //得到结构体大小,用于GetAdaptersInfo参数 unsigned long stSize = sizeof(IP_ADAPTER_INFO); //PIP_ADAPTER_INFO结构体指针存储本机网卡信息 PIP_ADAPTER_INFO pIpAdapterInfo = (PIP_ADAPTER_INFO)new BYTE[stSize]; //调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量;其中stSize参数既是一个输入量也是一个输出量 int nRel = GetAdaptersInfo(pIpAdapterInfo,&stSize); //记录网卡数量 int netCardNum = 0; //记录每张网卡上的IP地址数量 int IPnumPerNetCard = 0; if (ERROR_BUFFER_OVERFLOW == nRel) { //如果函数返回的是ERROR_BUFFER_OVERFLOW //则说明GetAdaptersInfo参数传递的内存空间不够,同时其传出stSize,表示需要的空间大小 //这也是说明为什么stSize既是一个输入量也是一个输出量 //释放原来的内存空间 delete pIpAdapterInfo; //重新申请内存空间用来存储所有网卡信息 pIpAdapterInfo = (PIP_ADAPTER_INFO)new BYTE[stSize]; //再次调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量 nRel=GetAdaptersInfo(pIpAdapterInfo,&stSize); } if (ERROR_SUCCESS == nRel) { //输出网卡信息 //可能有多网卡,因此通过循环去判断 while (pIpAdapterInfo) { cout<<"网卡数量:"<<++netCardNum<<endl; cout<<"网卡名称:"<AdapterName<<endl; cout<<"网卡描述:"<Description<<endl; switch(pIpAdapterInfo->Type) { case MIB_IF_TYPE_OTHER: cout<<"网卡类型:"<<"OTHER"<<endl; break; case MIB_IF_TYPE_ETHERNET: cout<<"网卡类型:"<<"ETHERNET"<<endl; break; case MIB_IF_TYPE_TOKENRING: cout<<"网卡类型:"<<"TOKENRING"<<endl; break; case MIB_IF_TYPE_FDDI: cout<<"网卡类型:"<<"FDDI"<<endl; break; case MIB_IF_TYPE_PPP: printf("PPn"); cout<<"网卡类型:"<<"PPP"<<endl; break; case MIB_IF_TYPE_LOOPBACK: cout<<"网卡类型:"<<"LOOPBACK"<<endl; break; case MIB_IF_TYPE_SLIP: cout<<"网卡类型:"<<"SLIP"<<endl; break; default: break; } cout<<"网卡MAC地址:"; for (DWORD i = 0; i < pIpAdapterInfo->AddressLength; i++) if (i < pIpAdapterInfo->AddressLength-1) { printf("%02X-", pIpAdapterInfo->Address[i]); } else { printf("%02Xn", pIpAdapterInfo->Address[i]); } cout<<"网卡IP地址如下:"<<endl; //可能网卡有多IP,因此通过循环去判断 IP_ADDR_STRING *pIpAddrString =&(pIpAdapterInfo->IpAddressList); do { cout<<"该网卡上的IP数量:"<<++IPnumPerNetCard<<endl; cout<<"IP 地址:"<IpAddress.String<<endl; cout<<"子网地址:"<IpMask.String<<endl; cout<<"网关地址:"<GatewayList.IpAddress.String<<endl; pIpAddrString=pIpAddrString->Next; } while (pIpAddrString); pIpAdapterInfo = pIpAdapterInfo->Next; cout<<"--------------------------------------------------------------------"<<endl; } } //释放内存空间 if (pIpAdapterInfo) { delete pIpAdapterInfo; } char msg[512] = {0}; gets_s(msg); return 0; }
收藏的用户(0) X
正在加载信息~
推荐阅读
最新回复 (0)
站点信息
- 文章2305
- 用户1336
- 访客11455538
每日一句
Talent without working hard is nothing.
没有努力,天份不代表什么。
没有努力,天份不代表什么。
MySQL 数据库优化
This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its de
免ROOT实现模拟点击任意位置
Mobaxterm终端神器
CreateProcessW要注意的细节问题
Autonomous NAT Traversal
【教程】win10 彻底卸载edge浏览器
eclipse工程基于Xposed的一个简单Hook
排名前5的开源在线机器学习
Mac OS最简单及(Karabiner)快捷键设置
发一款C++编写的麻将
VMware NAT端口映射外网访问虚拟机linux
独家发布最新可用My-AutoPost——wordpress 采集器
新会员