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

Beej 網絡編程指南第 5 部分:字節序、Socket 結構體與地址存儲

     編輯:關於C

字節序轉換函數

網絡傳輸統一使用大端序,主機序視 CPU 而定。四大轉換宏:

核心結構體

通用 sockaddr

struct sockaddr {
    unsigned short sa_family; // AF_INET / AF_INET6
    char sa_data[14];         // 協議地址+端口
};

IPv4 專用 sockaddr_in

struct sockaddr_in {
    short sin_family;      // AF_INET
    u_short sin_port;      // 網絡序端口
    struct in_addr sin_addr; // 32 位 IP
    char sin_zero[8];      // 填充對齊,用 memset/bzero 清零
};

in_addr 實際僅含 uint32_t s_addr,歷史原因保留結構體包裹。

IPv6 專用 sockaddr_in6

struct sockaddr_in6 {
    u_short sin6_family;   // AF_INET6
    u_short sin6_port;
    u_long  sin6_flowinfo; // 流標籤
    struct in6_addr sin6_addr; // 128 位 IP
    u_long  sin6_scope_id; // 接口索引
};

in6_addr 內部為 unsigned char s6_addr[16]。

統一存儲 sockaddr_storage

  • 足夠容納 IPv4/IPv6 任一結構
  • 用 ss_family 判斷實際類型再強轉
  • 解決 accept()/recvfrom() 參數類型不確定問題

實戰提示

  • sin_port/sin6_port 必須 htons() 寫入
  • sin_zero 建議 memset(&sa, 0, sizeof(sa)) 一次性清零
  • IPv6 地址初始化可用 in6addr_any 或 IN6ADDR_ANY_INIT

摘自 xiaobin_HLJ80 的專欄

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
函數含義適用
htons()Host → Network Short16 位端口號
htonl()Host → Network Long32 位 IPv4 地址
ntohs()Network → Host Short接收端口
ntohl()Network → Host Long接收 IPv4