C++通過GetAdapatersInfo獲取網卡配置信息


DWORD GetAdaptersInfo(
  PIP_ADAPTER_INFO pAdapterInfo,  //指向一個緩沖區,用來取得IP_ADAPTER_INFO結構列表
  PULONG pOutBufLen   //指定上面緩沖區大小,如果大小不夠,此參數返回所需大小

IP_ADAPTER_INFO結構包含了本地計算機網絡適配器的信息
typedef struct _IP_ADAPTER_INFO {
  struct _IP_ADAPTER_INFO* Next;//指向鏈表中下一個適配器(計算機可能有多個適配器)
  DWORD ComboIndex;    //保留字段
  char AdapterName[MAX_ADAPTER_NAME_LENGTH + 4];//使用ANSI字符串表示的適配器名稱   char Description[MAX_ADAPTER_DESCRIPTION_LENGTH + 4];//使用ANSI字符串表示的適配器描述   UINT AddressLength;//適配器MAC地址以字節計算的長度(一般6個字節)   BYTE Address[MAX_ADAPTER_ADDRESS_LENGTH];//硬件地址以BYTE數組所表示   DWORD Index;//適配器索引   UINT Type;//適配器類型,主要有以下幾種: /* * MIB_IF_TYPE_OTHER 1 * MIB_IF_TYPE_ETHERNET 6 * MIB_IF_TYPE_TOKENRING 9 * MIB_IF_TYPE_FDDI 15 * MIB_IF_TYPE_PPP 23 * MIB_IF_TYPE_LOOPBACK 24 * MIB_IF_TYPE_SLIP 28 */   UINT DhcpEnabled;//指定這個適配器是否開啟DHCP   PIP_ADDR_STRING CurrentIpAddress;//保留字段   IP_ADDR_STRING IpAddressList;//該適配器的IPv4地址鏈表   IP_ADDR_STRING GatewayList;//該適配器的網關IPv4地址鏈表   IP_ADDR_STRING DhcpServer;//該適配器的DHCP服務器的IPv4 地址鏈表   BOOL HaveWins;//該適配器是否使用WINS(Windows Internet名稱服務)   IP_ADDR_STRING PrimaryWinsServer;//WINS服務器主IP地址   IP_ADDR_STRING SecondaryWinsServer;//WINS次IP地址   time_t LeaseObtained;//獲取當前DCHP租用時間   time_t LeaseExpires;//當前DCHP租用期滿時間   } IP_ADAPTER_INFO,*PIP_ADAPTER_INFO;

IP_ADDR_STRING也是一個結構體

 

typedef struct _IP_ADDR_STRING {
    struct _IP_ADDR_STRING* Next;//指向下一個IP地址信息
    IP_ADDRESS_STRING IpAddress;
    IP_MASK_STRING IpMask;//子網掩碼
    DWORD Context;
} IP_ADDR_STRING, *PIP_ADDR_STRING;

typedef struct {
    char String[4 * 4];
} IP_ADDRESS_STRING, *PIP_ADDRESS_STRING, IP_MASK_STRING, *PIP_MASK_STRING;

typedef struct {
    char String[4 * 4];
} IP_ADDRESS_STRING, *PIP_ADDRESS_STRING, IP_MASK_STRING, *PIP_MASK_STRING;

 

 

 

完整代碼如下

#include <iostream>
#include <windows.h>
#include <Iphlpapi.h>
#pragma comment(lib, "Iphlpapi.lib")

using namespace std;

BOOL GetGlobalData()
{
    PIP_ADAPTER_INFO pIPAdapterInfo = new IP_ADAPTER_INFO();
    PIP_ADAPTER_INFO adapters = nullptr;
    ULONG size = sizeof(IP_ADAPTER_INFO);
    //填充pIPadapterInfo變量,其中size既是一個輸入量,也是一個輸出量
    int nRet = GetAdaptersInfo(pIPAdapterInfo, &size);
    //記錄網卡數量
    int netCarNum = 0;

    if (ERROR_BUFFER_OVERFLOW == nRet)
    {
        //如果返回此參數,說明GetAdaptersInfo參數傳遞的內存空間大小不夠,同時傳出size表示需要的內存空間大小
        //釋放原來的內存空間
        delete pIPAdapterInfo;
        pIPAdapterInfo = (PIP_ADAPTER_INFO)new byte[size];
        //再次調用GetAdaptersInfo填充結構體
        nRet = GetAdaptersInfo(pIPAdapterInfo, &size);
    }

    if (ERROR_SUCCESS == nRet)
    {
        adapters = pIPAdapterInfo;
        //輸出網卡信息,可能有多卡,需要循環判斷
        while (adapters)
        {
            cout << "        網卡數量: " << ++netCarNum << endl;
            cout << "        網卡名稱: " << adapters->AdapterName << endl;
            cout << "        網卡描述: " << adapters->Description << endl;
            cout << "        網卡類型: ";
            switch (adapters->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("PP\n");
                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: ";
            //以XX-XX-XX-XX-XX-XX的形式輸出MAC
            for (DWORD i = 0; i < adapters->AddressLength; ++i)
            {
                if (i < adapters->AddressLength - 1)
                {
                    printf("%02X-", adapters->Address[i]);
                }
                else
                {
                    printf("%02X\n", adapters->Address[i]);
                }
            }

            //可能網卡有多IP,因此通過循環去判斷
            IP_ADDR_STRING *pIpAddrString = &(adapters->IpAddressList);
            do
            {
                //記錄每張網卡的IP地址數量
                int IPNumPerCar = 0;
                cout << "該網卡上的IP數量:" << ++IPNumPerCar << endl;
                cout << "         IP 地址:" << pIpAddrString->IpAddress.String << endl;
                cout << "        子網地址:" << pIpAddrString->IpMask.String << endl;
                cout << "        網關地址:" << adapters->GatewayList.IpAddress.String << endl;
                pIpAddrString = pIpAddrString->Next;
            } while (pIpAddrString);
            adapters = adapters->Next;
            cout << "--------------------------------------------------------------------" << endl;
        }
    }
  //釋放分配的內存   if (pIPAdapterInfo)     delete pIPAdapterInfo;
  
  return true;
}

 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM