sockaddr和sockaddr_storage之间的区别

时间:2013-10-22 21:35:11

标签: c sockets

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

1 个答案:

答案 0 :(得分:8)

storage变体意味着“与最大可能大小一样大”,并且也正确对齐(因此它可以保存IPv6地址,或IPv4地址,或ISO协议地址,甚至一个AF_UNIX路径名或其他)。可以把它想象成bin / barrel / breadbox /(其他最喜欢的存储项),它足以容纳“任何套接字地址”,无论它是什么类型的套接字地址。 IPv4地址(struct sockaddr_in)很小,显然无法在其中保存IPv6地址,但struct sockaddr_storage有一个宽敞的货物区域。

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

(您在上面引用的版本中没有对齐项,这看起来很可疑。)