Windows使用C++获取网卡信息
2017-04-26 11:14
579 查看
使用 Windows sdk 提供的 API 函数
原文点击 : http://blog.csdn.net/lusirking/article/details/51780848
个人网站: Github , 欢迎点击给星
GetAdaptersInfo()可以获得本机所有网卡的网卡名 , 网卡描述 , 网卡 MAC 地址 , 网卡IP , 网卡类型等信息 , 并用
IP_ADAPTER_INFO结构体存储 ; 使用
GetIfEntry()可以获取网卡的状态 , 可有效判断出网卡通讯是否正常 , 是否插入网线等状态 ; 代码如下 :
#include "stdafx.h" #include <WinSock2.h> #include <Iphlpapi.h> #include <iostream> using namespace std; #pragma comment(lib,"Iphlpapi.lib") // 声明获取网卡状态信息函数 bool GetAdapterState(DWORD index); int main() { _CrtSetDbgFlag(_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG) | _CRTDBG_LEAK_CHECK_DF); // PIP_ADAPTER_INFO 结构体指针存储本机网卡信息 PIP_ADAPTER_INFO pIPAdapterInfo = new IP_ADAPTER_INFO(); PIP_ADAPTER_INFO pAdapter = NULL; // 得到结构体大小 , 用于 GetAdaptersInfo 参数 unsigned long ulSize = sizeof(IP_ADAPTER_INFO); // 调用 GetAdaptersInfo 函数 , 填充 pIpAdapterInfo 指针变量 , 其中 ulSize 参数既是一个输入量也是一个输出量 int nRstCode = GetAdaptersInfo(pIPAdapterInfo, &ulSize); // 记录网卡数量 int nNetCardNum = 0; // 记录每张网卡上的 IP 地址数量 int nIPNumPerNetCard = 0; if (ERROR_BUFFER_OVERFLOW == nRstCode) { // 如果函数返回的是 ERROR_BUFFER_OVERFLOW // 则说明 GetAdaptersInfo 参数传递的内存空间不够 , 同时其传出 ulSize , 表示需要的空间大小 // 这也是说明为什么 ulSize 既是一个输入量也是一个输出量 // 释放原来的内存空间 delete pIPAdapterInfo; // 重新申请内存空间用来存储所有网卡信息 pIPAdapterInfo = (PIP_ADAPTER_INFO)new BYTE[ulSize]; // 再次调用 GetAdaptersInfo 函数 , 填充 pIpAdapterInfo 指针变量 nRstCode = GetAdaptersInfo(pIPAdapterInfo, &ulSize); } if (ERROR_SUCCESS == nRstCode) { // 输出网卡信息 , 可能有多网卡 , 因此通过循环去判断 pAdapter = pIPAdapterInfo; while (pAdapter) { cout<<"网卡数量 : "<<++nNetCardNum<<endl; cout<<"网卡名称 : "<<pAdapter->AdapterName<<endl; cout<<"网卡描述 : "<<pAdapter->Description<<endl; switch(pAdapter->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: 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<pAdapter->AddressLength; i++) { if (i < pAdapter->AddressLength-1) { printf("%02X-", pAdapter->Address[i]); } else { printf("%02X\n", pAdapter->Address[i]); } } cout<<"网卡IP地址如下 : "<<endl; // 可能网卡有多 IP , 因此通过循环去判断 IP_ADDR_STRING *pIPAddrString =&(pAdapter->IpAddressList); nIPNumPerNetCard = 0; while (pIPAddrString) { cout<<"该网卡上的IP数量 : "<<++nIPNumPerNetCard<<endl; cout<<"IP 地址 : "<<pIPAddrString->IpAddress.String<<endl; cout<<"子网地址 : "<<pIPAddrString->IpMask.String<<endl; cout<<"网关地址 : "<<pAdapter->GatewayList.IpAddress.String<<endl; pIPAddrString=pIPAddrString->Next; } if (GetAdapterState(pAdapter->Index)) { cout<<"网卡工作正常"<<endl; } else { cout<<"网卡工作异常"<<endl; } pAdapter = pAdapter->Next; cout<<"--------------------------------------------------------------------"<<endl; } } // 释放内存空间 if (pIPAdapterInfo != NULL) { delete[] pIPAdapterInfo; pIPAdapterInfo = NULL; } getchar(); return 0; } bool GetAdapterState(DWORD nIndex) { MIB_IFROW miInfo; // 存放获取到的 Adapter 参数 memset(&miInfo, 0, sizeof(MIB_IFROW)) ; miInfo.dwIndex = nIndex; // dwIndex 是需要获取的 Adapter 的索引 if(GetIfEntry(&miInfo) != NOERROR) { printf("ErrorCode = %d\n" ,GetLastError()); return false; } if(miInfo.dwOperStatus==IF_OPER_STATUS_NON_OPERATIONAL || miInfo.dwOperStatus==IF_OPER_STATUS_UNREACHABLE || miInfo.dwOperStatus==IF_OPER_STATUS_DISCONNECTED || miInfo.dwOperStatus==IF_OPER_STATUS_CONNECTING) { return false; } else if(miInfo.dwOperStatus==IF_OPER_STATUS_OPERATIONAL || miInfo.dwOperStatus == IF_OPER_STATUS_CONNECTED) { return true; } else { return false; } }
原文点击 : http://blog.csdn.net/lusirking/article/details/51780848
个人网站: Github , 欢迎点击给星
相关文章推荐
- windows平台下 c++获取 系统版本 网卡 内存 CPU 硬盘 显卡信息
- windows平台下 c++获取 系统版本 网卡 内存 CPU 硬盘 显卡信息<转>
- 【转】windows c++获取文件信息——_stat函数的使用
- Windows C++获取网卡信息【转】
- 使用 Windows Scripting Host 中的 WshShortcut 获取快捷方式的信息
- 【PERL】使用wmi获取windows硬件信息
- c++ 使用wmi 获取系统相关信息
- C++ 中通过GetAdaptersInfo获取网卡配置和Ip地址信息
- C++ 中通过GetAdaptersInfo获取网卡配置和Ip地址信息
- PowerShell 2.0之使用WMI管理Windows(四)获取软硬件信息
- windows平台下,c++获取cpu型号,读取注册表获取系统软硬件信息代码
- C++获取Windows系统License信息的方法
- 在C++中使用CPUID指令获取CPU信息
- C++中使用MediaInfo库获取视频信息
- windows下使用WinPcap获取网卡列表
- windows下获取网卡信息
- Windows下使用注册表修改网卡信息
- 在vb中使用Iphlpapi.dll获取网络信息 第二章 第九节 获取网卡–IP地址映射表
- 获取当前可使用的网卡并检查网卡设置(网卡的IP,网关,子网掩码,DNS,备用DNS信息)
- 在vb中使用Iphlpapi.dll获取网络信息 第二章 第九节 获取网卡–IP地址映射表