简体   繁体   English

sockaddr和sockaddr_storage之间的区别

[英]Difference between sockaddr and sockaddr_storage

Which are the difference between sockaddr and sockaddr_storage? sockaddr和sockaddr_storage有什么区别? I don't understand because looking at the code they look quite the same: 我不明白,因为查看代码看起来非常相似:

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

The storage variant is meant to be "as big as the maximum possible size", and properly aligned too (so it can hold an IPv6 address, or an IPv4 address, or an ISO protocol address, or even an AF_UNIX pathname or whatever). storage变体意味着“与最大可能大小一样大”,并且也正确对齐(因此它可以保存IPv6地址,或IPv4地址,或ISO协议地址,甚至AF_UNIX路径名或其他)。 Think of it as a bin/barrel/breadbox/(other favorite storage item) that's big enough to hold "any socket address", no matter what kind of socket address it is. 可以把它想象成bin / barrel / breadbox /(其他最喜欢的存储项),它足以容纳“任何套接字地址”,无论它是什么类型的套接字地址。 An IPv4 address ( struct sockaddr_in ) is tiny and clearly can't hold an IPv6 address within it, but a struct sockaddr_storage has a large roomy cargo area. IPv4地址( struct sockaddr_in )很小,显然不能在其中包含IPv6地址,但struct sockaddr_storage有一个宽敞的货物区域。

The original struct sockaddr probably should have been this big, but wasn't. 最初的struct sockaddr可能应该是这么大,但事实并非如此。 So this is basically a workaround for a historical error. 所以这基本上是一个历史错误的解决方法。

(The version you quoted above does not have an alignment item in it, which seems suspect.) (您在上面引用的版本中没有对齐项,这看起来很可疑。)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM