我正在阅读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时会发生什么.
请记住,所有采用struct sockaddr指针的函数也会占用结构的大小.与实际套接字上的元数据一起,系统很容易知道您传递的是哪种结构.
还要注意,它总是指向传递的地址结构,而不是实际的结构,它们不起作用.所以你永远不会这样
(struct sockaddr) a_in6_sockaddr
Run Code Online (Sandbox Code Playgroud)
你做
(struct sockaddr *) &a_in6_sockaddr
Run Code Online (Sandbox Code Playgroud)