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

Beej 網絡編程指南第 7 部分:從 IPv4 遷移到 IPv6

     編輯:關於C

遷移核心清單

將現有 IPv4 代碼升級為雙棧兼容的 12 步走:

  1. 統一地址獲取:棄用手工填充 sockaddr_in,改用 getaddrinfo() 獲取协议無關的 sockaddr
  2. 消除硬編碼:所有字面量地址/端口改為變量或配置
  3. 地址族常量:AF_INET → AF_INET6
  4. 協議族常量:PF_INET → PF_INET6
  5. 任意地址:INADDR_ANY → in6addr_any 或 IN6ADDR_ANY_INIT 初始化 in6_addr
  6. 地址結構體:sockaddr_in → sockaddr_in6(注意無 sin6_zero 字段)
  7. IP 結構體:in_addr → in6_addr
  8. 文本轉二進制:inet_aton()/inet_addr() → inet_pton()
  9. 二進制轉文本:inet_ntoa() → inet_ntop()
  10. 主機名解析:gethostbyname() → getaddrinfo()
  11. 反向解析:gethostbyaddr() → getnameinfo()(舊 API 也支持 IPv6)
  12. 廣播替代:INADDR_BROADCAST → IPv6 組播

代碼對比

// IPv4
struct sockaddr_in sa;
sa.sin_addr.s_addr = INADDR_ANY;

// IPv6
struct sockaddr_in6 sa6;
sa6.sin6_addr = in6addr_any;
// 或
struct in6_addr ia6 = IN6ADDR_ANY_INIT;

關鍵提示

  • getaddrinfo() 返回鏈表,遍歷嘗試 socket()/bind()/connect() 實現雙棧自動回退
  • 使用 AI_PASSIVE 旗標配合 NULL 節點名獲取任意地址
  • 編譯時鏈接 -lnsl -lsocket -lresolv (Solaris) 或 ws2_32.lib (Windows)

摘自 xiaobin_HLJ80 的專欄

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved