首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

使用 IPHLPAPI 完整擷取網卡資訊(MAC、IP、閘道、DNS、DHCP)

     編輯:關於C++

在 Windows 平台上取得網路介面卡詳細資訊(MAC 位址、IP 位址、子網路遮罩、預設閘道、WINS/DHCP 伺服器等),最標準的方式是呼叫 IP Helper API (IPHLPAPI) 中的 GetAdaptersInfo 函式。本文提供完整的 C++ 主控台程式範例,展示如何正確配置緩衝區、處理錯誤代碼、解析多張網卡與多重 IP 位址。

必要環境與標頭檔

  • 需安裝 Microsoft Platform SDK(含 Iphlpapi.h、Iphlpapi.lib)。
  • 專案設定:加入 #include <Iphlpapi.h> 並連結 Iphlpapi.lib。
  • 範例使用 MFC CString 簡化字串操作,亦可改用 std::string。

核心流程三步驟

  1. 第一次呼叫 GetAdaptersInfo 傳入 NULL 緩衝區,取得所需緩衝區大小(ERROR_BUFFER_OVERFLOW)。
  2. 配置記憶體(malloc),再次呼叫取得 IP_ADAPTER_INFO 鏈結串列。
  3. 遍歷鏈結串列,逐張網卡解析 IP_ADAPTER_INFO 結構與其下的 IP_ADDR_STRING 陣列。

關鍵程式碼片段

// 1. 取得所需緩衝區大小
ULONG bufLen = 0;
GetAdaptersInfo(nullptr, &bufLen); // 預期回傳 ERROR_BUFFER_OVERFLOW

// 2. 配置記憶體並取得資料
PIP_ADAPTER_INFO pAdapterInfo = (PIP_ADAPTER_INFO)malloc(bufLen);
DWORD ret = GetAdaptersInfo(pAdapterInfo, &bufLen);
if (ret != ERROR_SUCCESS) { /* 錯誤處理 */ }

// 3. 遍歷每張網卡
for (PIP_ADAPTER_INFO p = pAdapterInfo; p; p = p->Next) {
    // MAC 位址
    CString mac;
    mac.Format(_T("%02X:%02X:%02X:%02X:%02X:%02X"),
               p->Address[0], p->Address[1], p->Address[2],
               p->Address[3], p->Address[4], p->Address[5]);

    // 多重 IP 位址(IP_ADDR_STRING 鏈結串列)
    CString ipList;
    for (PIP_ADDR_STRING ip = &p->IpAddressList; ip; ip = ip->Next) {
        ipList += ip->IpAddress.String;
        if (ip->Next) ipList += _T("\r\n");
    }

    // 子網路遮罩、閘道、WINS、DHCP
    CString mask = p->IpAddressList.IpMask.String;
    CString gw   = p->GatewayList.IpAddress.String;
    CString wins = p->HaveWins ? p->PrimaryWinsServer.IpAddress.String : _T("N/A");
    CString dhcp = p->DhcpEnabled ? p->DhcpServer.IpAddress.String : _T("N/A");

    // 輸出或儲存...
}
free(pAdapterInfo);

常見錯誤代碼對照

代碼常數說明
0ERROR_SUCCESS成功
111ERROR_BUFFER_OVERFLOW緩衝區太小,需重新配置
232ERROR_NO_DATA無網路介面卡資訊
50ERROR_NOT_SUPPORTED作業系統不支援(極舊版本)

進階應用建議

  • 若需支援 IPv6,請改用 GetAdaptersAddresses(Vista+)。
  • 將解析邏輯封裝為 NetworkAdapterInfo 類別,提供 GetAllAdapters() 回傳 std::vector<Adapter>,方便上層 UI 綁定。
  • 記得在 DLL/服務中使用時,同樣需連結 Iphlpapi.lib 並處理載入失敗情況。

掌握 GetAdaptersInfo 的正確使用模式,即可在任何 Win32/Win64 專案中可靠地取得完整網卡資訊。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved