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

Beej 網絡編程指南第 06 篇:IP 地址轉換、私有網絡與 NAT 穿透基礎

     編輯:關於C語言

4. IP 地址進階:字串與二進制互轉

現代 API:inet_pton / inet_ntop (支援 IPv4 & IPv6)

舊式 inet_addr、inet_ntoa 僅支援 IPv4,**棄用**。

// IPv4
struct sockaddr_in sa;
inet_pton(AF_INET, "192.0.2.1", &(sa.sin_addr));

// IPv6
struct sockaddr_in6 sa6;
inet_pton(AF_INET6, "2001:db8:63b3:1::3490", &(sa6.sin6_addr));

錯誤檢查必不可少:

  • 返回 1:成功
  • 返回 0:輸入非合法地址格式
  • 返回 -1:系統錯誤(查 errno)

反向轉換:二進制 → 字串

char ip4[INET_ADDRSTRLEN];   // 16 字節足夠 "255.255.255.255"
char ip6[INET6_ADDRSTRLEN];  // 46 字節足夠 IPv6 全寫

inet_ntop(AF_INET,  &(sa.sin_addr),  ip4, sizeof(ip4));
inet_ntop(AF_INET6, &(sa6.sin6_addr), ip6, sizeof(ip6));

inet_ntop 使用示意

4.1 私有網絡與 NAT

為什麼需要私有地址?

IPv4 地址枯竭。RFC 1918 保留三塊私有地址塊,僅用於內網,公網路由器**不轉發**:

類別CIDR範圍可用主機數
A 類10.0.0.0/810.0.0.0 – 10.255.255.25516,777,214
B 類172.16.0.0/12172.16.0.0 – 172.31.255.2551,048,574
C 類192.168.0.0/16192.168.0.0 – 192.168.255.25565,534

NAT (Network Address Translation) 如何工作?

  1. 內網主機用私有 IP(如 192.168.1.5)發起連線。
  2. 邊界 NAT 設備(家用路由器)將來源 IP 替換為公網 IP,記錄映射(私有 IP:Port ↔ 公網 IP:Port)。
  3. 回包到達公網 IP,NAT 查表還原私有 IP,轉發給內網主機。

對應用層開發者:**完全透明**,無需感知 NAT 存在。只需綁定 0.0.0.0 或具體私有 IP,系統協議棧自動處理。

關鍵提醒

  • inet_pton/ntop 僅處理**數字 IP**,域名解析請用 getaddrinfo()。
  • 私有網絡地址在公網**不可路由**,兩個不同內網可同時使用 192.168.1.0/24 而不衝突。
  • IPv6 設計初衷即解決地址枯竭,理論上每設備可獲全球唯一公網地址,NAT 在 IPv6 中非必需(但仍有 NPTv6 等機制)。

掌握地址轉換 API 與私有網絡/NAT 基礎,是編寫健壯跨平台網絡程式的必修課。

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