網路程式開發中,常需枚舉本機所有網卡綁定的 IPv4 位址(如伺服器綁定、客戶端連線選擇)。本文提供基於 Winsock 2 標準 API 的主控台示範程式,相容 Windows XP SP2 + VC6 SP5 環境,核心邏輯可直接移植至 MFC/ATL 專案。
WSAStartup 初始化 Winsock 庫gethostname 取得主機名稱gethostbyname 解析主機對應的 HOSTENT 結構h_addr_list 陣列,配合 inet_ntoa 轉換為點分十進制字串WSACleanup 釋放資源// GetIplist.cpp - 獲取本機 IP 列表
#include <iostream>
#include <list>
#include <string>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")
using namespace std;
bool GetIpList(list<string>& r_iplist) {
WSADATA wsaData;
if (WSAStartup(MAKEWORD(2,2), &wsaData) != 0) {
cerr << "WSAStartup failed!" << endl;
return false;
}
char szHostName[256];
if (gethostname(szHostName, sizeof(szHostName)) == SOCKET_ERROR) {
cerr << "gethostname failed: " << WSAGetLastError() << endl;
WSACleanup();
return false;
}
HOSTENT* pHost = gethostbyname(szHostName);
if (pHost) {
for (int i = 0; pHost->h_addr_list[i]; ++i) {
IN_ADDR addr = *reinterpret_cast<IN_ADDR*>(pHost->h_addr_list[i]);
r_iplist.push_back(inet_ntoa(addr));
}
}
WSACleanup();
return true;
}
int main() {
list<string> ipList;
if (!GetIpList(ipList)) return -1;
cout << "本機 IP 列表:" << endl;
for (const auto& ip : ipList)
cout << " " << ip << endl;
return 0;
}
GetAdaptersAddresses (IP Helper API) 同時獲取 IPv4/IPv6 位址及網卡資訊。gethostbyname 已棄用: 新代碼應使用 getaddrinfo 以支援 IPv6 並具備執行緒安全性。GetAdaptersInfo 判斷實體/虛擬網卡、啟用狀態、閘道等屬性過濾。// 在對話框或視圖類中調用
CListBox& lb = m_lstIP; // 假設有列表框控制項
list<string> ips;
GetIpList(ips);
for (auto& ip : ips) lb.AddString(CString(ip.c_str()));
雖然 gethostbyname 方案在 IPv4 環境下簡單有效,但新專案強烈建議採用 IP Helper API (GetAdaptersAddresses) 以獲得完整的網路拓撲資訊與跨平台相容性。本文代碼作為經典 Winsock 範式保留參考價值。