首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++ IPv6 網絡編程完整指南:從地址結構到雙棧服務器實現

     編輯:關於C++

IPv4 面臨的挑戰與 IPv6 誕生背景

  • 地址空間耗盡(32 位約 43 億地址)。
  • 路由表膨脹,缺乏層次化編址。
  • 配置複雜,依賴 DHCP 或靜態分配。

IPv6 採用 128 位地址(約 3.4×10³⁸),引入無狀態自動配置、簡化報頭、內置 IPsec 等特性。

地址結構對比

特性IPv4 (sockaddr_in)IPv6 (sockaddr_in6)
地址長度32 位 (4 字節)128 位 (16 字節)
結構大小16 字節28 字節
地址族AF_INETAF_INET6
表示格式點分十進制 (192.168.0.1)冒號十六進制 (21DA:00D3:...:DAC3)

協議無關編程關鍵 API

getaddrinfo() - 統一名稱解析

替代 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); // 返回鏈表,包含多個地址

getnameinfo() - 反向解析

將 Socket 地址轉為主機名/服務名。

freeaddrinfo() - 釋放結果鏈表

雙棧客戶端實現流程

  1. 調用 getaddrinfo 獲取地址鏈表。
  2. 遍歷鏈表,嘗試 socket -> connect,成功即跳出。
  3. 使用返回的 ai_addr 進行後續通信。

雙棧服務器實現流程

  1. getaddrinfo 設置 AI_PASSIVE | AF_UNSPEC,獲取 IPv4 和 IPv6 兩個監聽地址。
  2. 遍歷結果鏈表,為每個地址創建 Socket、bind、listen。
  3. 使用 select/poll/IOCP 同時監聽多個 Socket。
  4. accept 獲取連接,調用 getnameinfo 顯示客戶端地址。

完整 Echo 服務器代碼骨架

文章提供了基於 MFC/Win32 的 CIPv6 類完整實現,包含:

  • WSAStartup 初始化(版本 2.2)。
  • getaddrinfo 解析綁定地址(強制 AF_INET6 演示)。
  • Socket 創建、綁定、監聽錯誤處理。
  • Select 模型處理并發連接。
  • recv/send 回環數據。
  • 錯誤碼轉文本(FormatMessage)。

遷移建議

  • 優先使用 getaddrinfo/getnameinfo 替代舊 API。
  • 存儲地址使用 sockaddr_storage(足夠容納 IPv6)。
  • 避免硬編碼地址族,使用 AF_UNSPEC 實現協議無關性。
  • 測試環境需支持 IPv6(WinXP SP1+/Win7+ 默認支持)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved