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