WSAStartup() 初始化 Winsockgethostname() 取本機主機名gethostbyname() 解析主機名得 HOSTENTh_addr_list[0] 取第一個 IP,inet_ntoa() 轉點分十進制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.libgethostbyname() 已棄用,新代碼建議用 getaddrinfo() 支持 IPv6strdup摘自 lingxiu0613 的專欄