#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;
}
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 轉字串cl getip.cpp wsock32.lib
// 需正確設定 LIB 環境變數或執行 vcvars32.bat
Windows Vista+ 建議使用 GetAdaptersAddresses (IPHLPAPI) 取得更完整的介面資訊(含 IPv6、介面名稱、閘道等)。