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

VC 獲取本機所有 IP 位址的標準實現方案

     編輯:VC 教學

需求背景

網路程式開發中,常需枚舉本機所有網卡綁定的 IPv4 位址(如伺服器綁定、客戶端連線選擇)。本文提供基於 Winsock 2 標準 API 的主控台示範程式,相容 Windows XP SP2 + VC6 SP5 環境,核心邏輯可直接移植至 MFC/ATL 專案。

核心流程圖解

  1. WSAStartup 初始化 Winsock 庫
  2. gethostname 取得主機名稱
  3. gethostbyname 解析主機對應的 HOSTENT 結構
  4. 遍歷 h_addr_list 陣列,配合 inet_ntoa 轉換為點分十進制字串
  5. WSACleanup 釋放資源

完整可編譯代碼

// GetIplist.cpp - 獲取本機 IP 列表
#include <iostream>
#include <list>
#include <string>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")

using namespace std;

bool GetIpList(list<string>& r_iplist) {
    WSADATA wsaData;
    if (WSAStartup(MAKEWORD(2,2), &wsaData) != 0) {
        cerr << "WSAStartup failed!" << endl;
        return false;
    }

    char szHostName[256];
    if (gethostname(szHostName, sizeof(szHostName)) == SOCKET_ERROR) {
        cerr << "gethostname failed: " << WSAGetLastError() << endl;
        WSACleanup();
        return false;
    }

    HOSTENT* pHost = gethostbyname(szHostName);
    if (pHost) {
        for (int i = 0; pHost->h_addr_list[i]; ++i) {
            IN_ADDR addr = *reinterpret_cast<IN_ADDR*>(pHost->h_addr_list[i]);
            r_iplist.push_back(inet_ntoa(addr));
        }
    }

    WSACleanup();
    return true;
}

int main() {
    list<string> ipList;
    if (!GetIpList(ipList)) return -1;

    cout << "本機 IP 列表:" << endl;
    for (const auto& ip : ipList)
        cout << "  " << ip << endl;
    return 0;
}

關鍵技術點補充

  • IPv6 支援: 現代系統建議改用 GetAdaptersAddresses (IP Helper API) 同時獲取 IPv4/IPv6 位址及網卡資訊。
  • gethostbyname 已棄用: 新代碼應使用 getaddrinfo 以支援 IPv6 並具備執行緒安全性。
  • 多網卡排序: 返回順序取決於網卡綁定順序,生產環境常需結合 GetAdaptersInfo 判斷實體/虛擬網卡、啟用狀態、閘道等屬性過濾。

MFC 專案快速移植提示

// 在對話框或視圖類中調用
CListBox& lb = m_lstIP; // 假設有列表框控制項
list<string> ips;
GetIpList(ips);
for (auto& ip : ips) lb.AddString(CString(ip.c_str()));

結語

雖然 gethostbyname 方案在 IPv4 環境下簡單有效,但新專案強烈建議採用 IP Helper API (GetAdaptersAddresses) 以獲得完整的網路拓撲資訊與跨平台相容性。本文代碼作為經典 Winsock 範式保留參考價值。

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