我正在阅读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时会发生什么。
答案 0 :(得分:5)
请记住,所有采用struct sockaddr
指针的函数也会采用结构的 size 。与实际套接字上的元数据一起,系统很容易知道你传递的是什么类型的结构。
另请注意,传递的地址结构始终是指针,而不是无效的实际结构。所以你永远不会这样。
(struct sockaddr) a_in6_sockaddr
你做了
(struct sockaddr *) &a_in6_sockaddr