![Visual C++ 2017网络编程实战](https://wfqqreader-1252317822.image.myqcloud.com/cover/473/34061473/b_34061473.jpg)
上QQ阅读APP看书,第一时间看更新
2.4 获取本机所有网卡(包括虚拟网卡)的列表和信息
前一节我们获取了物理网卡的信息。有时候电脑上还存在虚拟网卡,比如安装VMware之类的软件,就会自动生成虚拟网卡。本机要获取的是包括虚拟网卡在内的所有网卡的信息,获取的方法依然是使用GetAdaptersInfo(该函数前面已经介绍过了,这里不再赘述)。
【例2.4】获取本机所有网卡信息
(1)新建一个控制台工程test。
(2)打开test.cpp,输入如下代码:
#include "stdafx.h" #include <Windows.h> #include <IPHlpApi.h> #include <iostream> #pragma comment(lib,"IPHlpApi.lib") using namespace std; BOOL GetLocalAdaptersInfo() { //IP_ADAPTER_INFO结构体 PIP_ADAPTER_INFO pIpAdapterInfo = NULL; pIpAdapterInfo = new IP_ADAPTER_INFO; //结构体大小 unsigned long ulSize = sizeof(IP_ADAPTER_INFO); //获取适配器信息 int nRet = GetAdaptersInfo(pIpAdapterInfo, &ulSize); if (ERROR_BUFFER_OVERFLOW == nRet) { //空间不足,删除之前分配的空间 delete[]pIpAdapterInfo; //重新分配大小 pIpAdapterInfo = (PIP_ADAPTER_INFO) new BYTE[ulSize]; //获取适配器信息 nRet = GetAdaptersInfo(pIpAdapterInfo, &ulSize); //获取失败 if (ERROR_SUCCESS != nRet) { if (pIpAdapterInfo != NULL) { delete[]pIpAdapterInfo; } return FALSE; } } //MAC 地址信息 char szMacAddr[20]; //赋值指针 PIP_ADAPTER_INFO pIterater = pIpAdapterInfo; while (pIterater) { cout << "网卡名称:" << pIterater->AdapterName << endl; cout << "网卡描述:" << pIterater->Description << endl; sprintf_s(szMacAddr, 20, "%02X-%02X-%02X-%02X-%02X-%02X", pIterater->Address[0], pIterater->Address[1], pIterater->Address[2], pIterater->Address[3], pIterater->Address[4], pIterater->Address[5]); cout << "MAC 地址:" << szMacAddr << endl; cout << "IP地址列表:" << endl << endl; //指向IP地址列表 PIP_ADDR_STRING pIpAddr = &pIterater->IpAddressList; while (pIpAddr) { cout << "IP地址: " << pIpAddr->IpAddress.String << endl; cout << "子网掩码:" << pIpAddr->IpMask.String << endl; //指向网关列表 PIP_ADDR_STRING pGateAwayList = &pIterater->GatewayList; while (pGateAwayList) { cout << "网关: " << pGateAwayList->IpAddress.String << endl; pGateAwayList = pGateAwayList->Next; } pIpAddr = pIpAddr->Next; } cout << endl << "--------------------------" << endl; pIterater = pIterater->Next; } //清理 if (pIpAdapterInfo) { delete[]pIpAdapterInfo; } return TRUE; } int _tmain(int argc, _TCHAR* argv[]) { GetLocalAdaptersInfo(); cin.get(); return 0; }
(3)保存工程并运行,结果如图2-7所示。
![](https://epubservercos.yuewen.com/F84FA5/18225432201803906/epubprivate/OEBPS/Images/Figure-P57_5149.jpg?sign=1739366620-ajJpJvvbYz32NZ4R2JsLITpUUXDNVIAM-0-397e2dffae95033ee2b6aaea61af5422)
图2-7
我们可以看到包括VMware的虚拟网卡在内的网卡信息也获取到了。