sockaddr如何保存sockaddr_storage或sockaddr_in6?

6
我正在阅读 Beej 的指南,他谈到程序员创建的不同结构。 他说我们可以将 sockaddr_storage/in6/in 传递给addrinfo,并且它会被转换为 sockaddr, 但是如何做到的呢?sockaddr 是16字节,而 sockaddr_in6 是28字节。
我读了 RFC 3493 的一小部分:
注意,sockaddr_in6 结构通常比一般的 sockaddr 结构要大。在许多现有的实现中,sizeof(struct sockaddr_in) 等于 sizeof(struct sockaddr),两者都是16字节。在将现有代码转换为IPv6时,需要仔细检查这种假设。
但它并没有解释当 sockaddr_in6 转换为 sockaddr 时会发生什么。
1个回答

7

记住,所有接受struct sockaddr指针的函数也要接受结构体的大小。加上实际套接字的元数据,系统很容易知道你正在传递哪种类型的结构体。

还要注意的是,始终传递指向地址结构的指针,而不是不能工作的实际结构体。因此,您永远不需要执行例如

(struct sockaddr) a_in6_sockaddr

你需要做的是

(struct sockaddr *) &a_in6_sockaddr

所以 sockaddr 相当无意义,我的意思是,如果该函数取代 void 指针,它不会改变任何事情? - BBLN
2
@BBLN 不完全是这样。这些函数接受 sockaddr 指针只是因为它们自从创建以来一直如此。 - Some programmer dude

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接