4

我正在阅读 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 时会发生什么。

4

1 回答 1

6

请记住,所有采用struct sockaddr指针的函数也采用结构的大小。连同实际套接字上的元数据,系统很容易知道您正在传递什么样的结构。

另请注意,它始终是指向正在传递的地址结构的指针,而不是不起作用的实际结构。所以你永远不要例如

(struct sockaddr) a_in6_sockaddr

你做

(struct sockaddr *) &a_in6_sockaddr
于 2013-10-28T11:24:00.807 回答