IPv6 採用 128 位地址(約 3.4×10³⁸),引入無狀態自動配置、簡化報頭、內置 IPsec 等特性。
| 特性 | IPv4 (sockaddr_in) | IPv6 (sockaddr_in6) |
|---|---|---|
| 地址長度 | 32 位 (4 字節) | 128 位 (16 字節) |
| 結構大小 | 16 字節 | 28 字節 |
| 地址族 | AF_INET | AF_INET6 |
| 表示格式 | 點分十進制 (192.168.0.1) | 冒號十六進制 (21DA:00D3:...:DAC3) |
替代 gethostbyname,支持 IPv4/IPv6 同時解析:
struct addrinfo hints = {}, *res = nullptr;
hints.ai_family = AF_UNSPEC; // 允許 IPv4 或 IPv6
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
hints.ai_flags = AI_PASSIVE; // 服務端綁定時使用
getaddrinfo(nullptr, "8080", &hints, &res); // 返回鏈表,包含多個地址
將 Socket 地址轉為主機名/服務名。
getaddrinfo 獲取地址鏈表。socket -> connect,成功即跳出。ai_addr 進行後續通信。getaddrinfo 設置 AI_PASSIVE | AF_UNSPEC,獲取 IPv4 和 IPv6 兩個監聽地址。bind、listen。select/poll/IOCP 同時監聽多個 Socket。accept 獲取連接,調用 getnameinfo 顯示客戶端地址。文章提供了基於 MFC/Win32 的 CIPv6 類完整實現,包含:
getaddrinfo 解析綁定地址(強制 AF_INET6 演示)。recv/send 回環數據。FormatMessage)。getaddrinfo/getnameinfo 替代舊 API。sockaddr_storage(足夠容納 IPv6)。AF_UNSPEC 實現協議無關性。