sockaddr如何持有sockaddr_storage或sockaddr_in6?

时间:2013-10-28 11:17:00

标签: c sockets posix

我正在阅读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 个答案:

答案 0 :(得分:5)

请记住,所有采用struct sockaddr指针的函数也会采用结构的 size 。与实际套接字上的元数据一起,系统很容易知道你传递的是什么类型的结构。

另请注意,传递的地址结构始终是指针,而不是无效的实际结构。所以你永远不会这样。

(struct sockaddr) a_in6_sockaddr
你做了

(struct sockaddr *) &a_in6_sockaddr