WSAStartup)。gethostname)。HOSTENT(gethostbyname)。h_addr_list 取第一個 IPv4 位址轉字串(inet_ntoa)。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 回傳的可能非預期介面。