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

Windows 取得本機 IP 位址:Winsock 實作

     編輯:關於C語言

核心邏輯

  1. 初始化 Winsock(WSAStartup)。
  2. 取得主機名稱(gethostname)。
  3. 解析主機名稱獲取 HOSTENT(gethostbyname)。
  4. 從 h_addr_list 取第一個 IPv4 位址轉字串(inet_ntoa)。
  5. 清理 Winsock(WSACleanup)。

完整代碼

#include <iostream>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")

char* GetLocalIP() {
    WSADATA wsaData;
    if (WSAStartup(MAKEWORD(2,2), &wsaData) != 0) return nullptr;

    char hostname[256];
    if (gethostname(hostname, sizeof(hostname)) == SOCKET_ERROR) {
        WSACleanup(); return nullptr;
    }

    HOSTENT* host = gethostbyname(hostname);
    char* ip = nullptr;
    if (host && host->h_addr_list[0]) {
        ip = inet_ntoa(*(IN_ADDR*)host->h_addr_list[0]);
    }
    WSACleanup();
    return ip;  // 注意:inet_ntoa 回傳靜態緩衝區,若需持久請複製
}

int main() {
    char* ip = GetLocalIP();
    if (ip) std::cout << "Local IP: " << ip << std::endl;
    else std::cerr << "Failed to get IP" << std::endl;
    return 0;
}

多網卡情況處理

h_addr_list 為指標陣列,以 NULL 結尾。遍歷即可列出所有 IPv4 位址:

for (int i=0; host->h_addr_list[i]; ++i) {
    char* ip = inet_ntoa(*(IN_ADDR*)host->h_addr_list[i]);
    std::cout << "IP " << i << ": " << ip << std::endl;
}

現代替代方案

  • GetAdaptersAddresses (IP Helper API):支援 IPv6、多網卡、詳細資訊(介面名、MAC、閘道等)。
  • GetAddrInfo + GetNameInfo:協議無關,支援 IPv4/IPv6 統一介面。

常見坑點

  • inet_ntoa 非執行緒安全,多執行緒環境請用 InetNtop 或自行複製字串。
  • gethostbyname 已棄用,新代碼建議用 GetAddrInfo。
  • 若主機有多個名稱/別名,gethostname 回傳的可能非預期介面。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved