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];
}
答案 0 :(得分:8)
storage
变体意味着“与最大可能大小一样大”,并且也正确对齐(因此它可以保存IPv6地址,或IPv4地址,或ISO协议地址,甚至一个AF_UNIX
路径名或其他)。可以把它想象成bin / barrel / breadbox /(其他最喜欢的存储项),它足以容纳“任何套接字地址”,无论它是什么类型的套接字地址。 IPv4地址(struct sockaddr_in
)很小,显然无法在其中保存IPv6地址,但struct sockaddr_storage
有一个宽敞的货物区域。
原来struct sockaddr
可能应该这么大,但事实并非如此。所以这基本上是一个历史错误的解决方法。
(您在上面引用的版本中没有对齐项,这看起来很可疑。)