| 函數 | 含義 | 適用 |
htons() | Host → Network Short | 16 位端口號 |
htonl() | Host → Network Long | 32 位 IPv4 地址 |
ntohs() | Network → Host Short | 接收端口 |
ntohl() | Network → Host Long | 接收 IPv4 |
核心結構體
通用 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 的專欄
- 上一篇文章: Beej 網絡編程指南第 6 部分:IP 地址轉換與私有網絡
- 下一篇文章: C 語言去重字符串集合:排序法與二叉樹法對比
Copyright ©
程式碼之家 All Rights Reserved