一、获取本机所有网卡(包括虚拟网卡)的列表和信息
在【网络编程】获取本机子网IP地址和子网掩码
博客中介绍了GetAdaptersInfo这个函数,并且通过它获取了本机的子网IP和子网掩码。 除此之外,这个函数中指针指向的结构体内部也同样存在网卡的信息,具体代码如下:
//获取本机物理网卡地址信息
void Test3() {
ULONG ulOutBufLen = sizeof(IP_ADAPTER_INFO);
PIP_ADAPTER_INFO AdapterInfo = (IP_ADAPTER_INFO*)malloc(ulOutBufLen);
DWORD dwRetVal = GetAdaptersInfo(AdapterInfo, &ulOutBufLen);
if (dwRetVal == ERROR_BUFFER_OVERFLOW) {
free(AdapterInfo);
AdapterInfo = (IP_ADAPTER_INFO*)malloc(ulOutBufLen);
dwRetVal = GetAdaptersInfo(AdapterInfo, &ulOutBufLen);
}
if (dwRetVal == NO_ERROR) {
IP_ADAPTER_INFO* pAdapter = AdapterInfo;
while (pAdapter != NULL) {
std::cout << "---------------------------------------------" << std::endl;
std::cout << "AdapterName = " << pAdapter->AdapterName << std::endl;
std::cout << "Description = " << pAdapter->Description << std::endl;
//物理网卡地址信息
printf("MAC:\t");
for (UINT i = 0; i < pAdapter->AddressLength; ++i) {
printf("%X", pAdapter->Address[i]); //十六进制输出
std::cout << (i == pAdapter->AddressLength - 1 ? '\n' : '-');
}
//其他信息
std::cout << "AdapterType = " << pAdapter->Type << std::endl;
//IP地址
std::cout << "--------------------------" << std::endl;
IP_ADAPTER_INFO* pIpAddr = AdapterInfo;
while (pIpAddr) {
std::cout << "IpAddress = " << pIpAddr->IpAddressList.IpAddress.String << std::endl;
std::cout << "IpMask = " << pIpAddr->IpAddressList.IpMask.String << std::endl;
pIpAddr = pIpAddr->Next;
}
std::cout << "--------------------------" << std::endl;
//网关
PIP_ADDR_STRING pGateAwayList = &pAdapter->GatewayList;
while (pGateAwayList) {
std::cout << "GateAwayAddr:" << pGateAwayList->IpAddress.String << std::endl;
pGateAwayList = pGateAwayList->Next;
}
pAdapter = pAdapter->Next;
std::cout << std::endl;
}
}
else {
std::cerr << "获取网络适配器信息出错: " << dwRetVal << std::endl;
}
if (AdapterInfo != NULL) {
free(AdapterInfo);
}
}
可以发现,包括虚拟机的网卡在内的网卡信息被成功打印了: