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

Windows 下獲取本機 IP 地址:Winsock 實現

     編輯:關於C

核心邏輯

  1. WSAStartup() 初始化 Winsock
  2. gethostname() 取本機主機名
  3. gethostbyname() 解析主機名得 HOSTENT
  4. h_addr_list[0] 取第一個 IP,inet_ntoa() 轉點分十進制
  5. WSACleanup() 清理

完整代碼

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

char* GetIpList() {
    WSADATA wsaData;
    if (WSAStartup(MAKEWORD(2,2), &wsaData)) 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;
}

int main() {
    char *ip = GetIpList();
    if (ip) std::cout << ip << std::endl;
    return 0;
}

多網卡處理

h_addr_list 為指針數組,遍歷 h_addr_list[i] 直到 NULL 可獲取所有 IPv4 地址。IPv6 需用 getaddrinfo()。

注意事項

  • 鏈接 ws2_32.lib
  • gethostbyname() 已棄用,新代碼建議用 getaddrinfo() 支持 IPv6
  • 返回指針指向靜態緩衝區,若需保存請 strdup

摘自 lingxiu0613 的專欄

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