sockaddr 和 sockaddr_storage 有哪些区别?我不明白,因为查看代码它们看起来非常相似:
struct sockaddr {
uint8_t sa_len;
sa_family_t sa_family;
char sa_data[14];
}
struct sockaddr_storage {
uint8_t ss_len;
sa_family_t ss_family;
char ss_padding[SIZE];
}
该storage
变体旨在“与最大可能大小一样大”,并且也正确对齐(因此它可以保存 IPv6 地址,或 IPv4 地址,或 ISO 协议地址,甚至是AF_UNIX
路径名或其他)。将其视为一个 bin/barrel/breadbox/(其他最喜欢的存储项目),它大到足以容纳“任何套接字地址”,无论它是哪种套接字地址。IPv4 地址 ( struct sockaddr_in
) 很小,显然不能在其中保存 IPv6 地址,但 astruct sockaddr_storage
有一个大的宽敞的货物区域。
原版struct sockaddr
可能应该有这么大,但事实并非如此。所以这基本上是历史错误的解决方法。
(您上面引用的版本中没有对齐项目,这似乎很可疑。)