// GetNetworkCardInformation.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 // GetNetworkCardInformation.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 #include#include #include #include #include #pragma comment(lib,"Iphlpapi.lib") /// @brief 拆功能键结构体, 获取信息 void GetNetworkCard(); void NetworkCardInformation(PIP_ADAPTER_INFO pIpAdapterInfo); int getMac(); int main() { //两个都可以使用 GetNetworkCard(); // getMac(); return 0; } int getMac() { PIP_ADAPTER_INFO pAdapterInfo; PIP_ADAPTER_INFO pAdapter = NULL; DWORD dwRetVal = 0; UINT i; struct tm newtime; char buffer[32]; errno_t error; ULONG ulOutBufLen = sizeof(IP_ADAPTER_INFO); pAdapterInfo = (IP_ADAPTER_INFO*)malloc(sizeof(IP_ADAPTER_INFO)); if (pAdapterInfo == NULL) { printf("Error allocating memory needed to call GetAdaptersinfon"); return 1; } // Make an initial call to GetAdaptersInfo to get // the necessary size into the ulOutBufLen variable if (GetAdaptersInfo(pAdapterInfo, &ulOutBufLen) == ERROR_BUFFER_OVERFLOW) { free(pAdapterInfo); pAdapterInfo = (IP_ADAPTER_INFO*)malloc(ulOutBufLen); if (pAdapterInfo == NULL) { printf("Error allocating memory needed to call GetAdaptersinfon"); return 1; } } if ((dwRetVal = GetAdaptersInfo(pAdapterInfo, &ulOutBufLen)) == NO_ERROR) { pAdapter = pAdapterInfo; while (pAdapter) { std::cout << "------------------------" << std::endl; printf("tComboIndex: t5dn", pAdapter->ComboIndex); printf("tAdapter Name: t%sn", pAdapter->AdapterName); printf("tAdapter Desc: t%sn", pAdapter->Description); printf("tAdapter Addr: t"); for (i = 0; i < pAdapter->AddressLength; i++) { if (i == (pAdapter->AddressLength - 1)) printf("%.2Xn", (int)pAdapter->Address[i]); else printf("%.2X-", (int)pAdapter->Address[i]); } printf("tIndex: t%dn", pAdapter->Index); printf("tType: t"); switch (pAdapter->Type) { case MIB_IF_TYPE_OTHER: printf("Othern"); break; case MIB_IF_TYPE_ETHERNET: printf("Ethernetn"); break; case MIB_IF_TYPE_TOKENRING: printf("Token Ringn"); break; case MIB_IF_TYPE_FDDI: printf("FDDIn"); break; case MIB_IF_TYPE_PPP: printf("PPPn"); break; case MIB_IF_TYPE_LOOPBACK: printf("Lookbackn"); break; case MIB_IF_TYPE_SLIP: printf("Slipn"); break; default: printf("Unknown type %ldn", pAdapter->Type); break; } printf("tIP Address: t%sn", pAdapter->IpAddressList.IpAddress.String); printf("tIP Mask: t%sn", pAdapter->IpAddressList.IpMask.String); printf("tGateway: t%sn", pAdapter->GatewayList.IpAddress.String); printf("t***n"); if (pAdapter->DhcpEnabled) { printf("tDHCP Enabled: Yesn"); printf("t DHCP Server: t%sn", pAdapter->DhcpServer.IpAddress.String); printf("t Lease Obtained: "); error = _localtime32_s(&newtime, (const __time32_t* )&pAdapter->LeaseObtained); if (error) printf("Invalid Argument to _localtime32_sn"); else { // Convert to an ASCII representation error = asctime_s(buffer, 32, &newtime); if (error) printf("Invalid Argument to asctime_sn"); else printf("%s", buffer); } printf("t Lease Expires: "); error = _localtime32_s(&newtime, (const __time32_t*)&pAdapter->LeaseExpires); if (error) printf("Invalid Argument to _localtime32_sn"); else { // Convert to an ASCII representation error = asctime_s(buffer, 32, &newtime); if (error) printf("Invalid Argument to asctime_sn"); else printf("%s", buffer); } } else printf("tDHCP Enabled: Non"); if (pAdapter->HaveWins) { printf("tHave Wins: Yesn"); printf("t Primary Wins Server: %sn", pAdapter->PrimaryWinsServer.IpAddress.String); printf("t Secondary Wins Server: %sn", pAdapter->SecondaryWinsServer.IpAddress.String); } else printf("tHave Wins: Non"); pAdapter = pAdapter->Next; std::cout << "------------------------" << std::endl; printf("n"); } } else { printf("GetAdaptersInfo failed with error: %dn", dwRetVal); } if (pAdapterInfo) free(pAdapterInfo); return 0; } /// @brief 拆功能键结构体, 获取信息 void GetNetworkCard() { //PIP_ADAPTER_INFO结构体指针存储本机网卡信息 PIP_ADAPTER_INFO pIpAdapterInfo = new IP_ADAPTER_INFO(); //得到结构体大小,用于GetAdaptersInfo参数 unsigned long stSize = sizeof(IP_ADAPTER_INFO); //调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量;其中stSize参数既是一个输入量也是一个输出量 int nRel = GetAdaptersInfo(pIpAdapterInfo, &stSize); 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) { //输出网卡信息 NetworkCardInformation(pIpAdapterInfo); } //释放内存空间 if (pIpAdapterInfo) { delete pIpAdapterInfo; } } ///函数作用,输出网卡信息 void NetworkCardInformation(PIP_ADAPTER_INFO pIpAdapterInfo) { //可能有多网卡,因此通过循环去判断 while (pIpAdapterInfo) { int i; std::cout << "网卡名称:" << pIpAdapterInfo->AdapterName << std::endl; std::cout << "网卡描述:" << pIpAdapterInfo->Description << std::endl; std::cout << "网卡MAC地址:";// << (unsigned char*)pIpAdapterInfo->Address << std::endl; for (i = 0; i < pIpAdapterInfo->AddressLength; i++) { if (i == (pIpAdapterInfo->AddressLength - 1)) printf("%.2Xn", (int)pIpAdapterInfo->Address[i]); else printf("%.2X-", (int)pIpAdapterInfo->Address[i]); } std::cout << "默认网关:" << pIpAdapterInfo->GatewayList.IpAddress.String << std::endl; for (UINT i = 0; i < pIpAdapterInfo->AddressLength; i++) if (i == pIpAdapterInfo->AddressLength - 1) { printf("%02xn", pIpAdapterInfo->Address[i]); } else { printf("%02x-", pIpAdapterInfo->Address[i]); } std::cout << "网卡IP地址如下:" << std::endl; //可能网卡有多IP,因此通过循环去判断 IP_ADDR_STRING* pIpAddrString = &(pIpAdapterInfo->IpAddressList); do { std::cout << pIpAddrString->IpAddress.String << std::endl; pIpAddrString = pIpAddrString->Next; } while (pIpAddrString); pIpAdapterInfo = pIpAdapterInfo->Next; std::cout << "*****************************************************" << std::endl; } return; }



