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

C++ 取得本機所有 IP 位址:Winsock gethostbyname 完整解析

     編輯:關於VC++

完整主控台程式

#include 
#include 
#pragma comment(lib, "wsock32.lib")

int main() {
    // 1. 初始化 Winsock 1.1
    WSADATA wsaData;
    if (WSAStartup(MAKEWORD(1,1), &wsaData)) {
        printf("WSAStartup failed: %d\n", WSAGetLastError());
        return -1;
    }

    // 2. 取得主機名
    char hostname[256];
    if (gethostname(hostname, sizeof(hostname)) != 0) {
        printf("gethostname error: %d\n", WSAGetLastError());
        WSACleanup(); return -1;
    }
    printf("Hostname: %s\n", hostname);

    // 3. 依主機名查詢 IP 列表
    hostent* pHost = gethostbyname(hostname);
    if (!pHost) {
        printf("gethostbyname error: %d\n", WSAGetLastError());
        WSACleanup(); return -1;
    }

    // 4. 解析 hostent 結構
    struct in_addr addr;
    for (int i = 0; pHost->h_addr_list[i]; ++i) {
        memcpy(&addr.s_addr, pHost->h_addr_list[i], pHost->h_length);
        printf("IP Address: %s\n", inet_ntoa(addr));
    }

    WSACleanup();
    return 0;
}

hostent 結構深度解析

struct hostent {
    char*  h_name;        // 官方主機名
    char** h_aliases;     // 別名列表
    short  h_addrtype;    // 地址類型 (AF_INET = 2)
    short  h_length;      // 每個地址長度 (IPv4 = 4)
    char** h_addr_list;   // 位址指標陣列,以 NULL 結尾
};
  • h_addr_list 為連續記憶體區塊,每筆 4 位元組 IPv4 位址
  • 需複製至 sockaddr_in.sin_addr 再用 inet_ntoa 轉字串
  • 多網卡機器會回傳多筆位址(含 LAN、VPN、虛擬網卡等)

編譯與執行

cl getip.cpp wsock32.lib
// 需正確設定 LIB 環境變數或執行 vcvars32.bat

現代替代方案

Windows Vista+ 建議使用 GetAdaptersAddresses (IPHLPAPI) 取得更完整的介面資訊(含 IPv6、介面名稱、閘道等)。

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