8

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];
}
4

1 回答 1

13

storage变体旨在“与最大可能大小一样大”,并且也正确对齐(因此它可以保存 IPv6 地址,或 IPv4 地址,或 ISO 协议地址,甚至是AF_UNIX路径名或其他)。将其视为一个 bin/barrel/breadbox/(其他最喜欢的存储项目),它大到足以容纳“任何套接字地址”,无论它是哪种套接字地址。IPv4 地址 ( struct sockaddr_in) 很小,显然不能在其中保存 IPv6 地址,但 astruct sockaddr_storage有一个大的宽敞的货物区域。

原版struct sockaddr可能应该有这么大,但事实并非如此。所以这基本上是历史错误的解决方法。

(您上面引用的版本中没有对齐项目,这似乎很可疑。)

于 2013-10-22T21:55:24.367 回答