sockaddr如何持有sockaddr_storage或sockaddr_in6?

BBL*_*BLN 4 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时会发生什么.

Som*_*ude 5

请记住,所有采用struct sockaddr指针的函数也会占用结构的大小.与实际套接字上的元数据一起,系统很容易知道您传递的是哪种结构.

还要注意,它总是指向传递的地址结构,而不是实际的结构,它们不起作用.所以你永远不会这样

(struct sockaddr) a_in6_sockaddr
Run Code Online (Sandbox Code Playgroud)

你做

(struct sockaddr *) &a_in6_sockaddr
Run Code Online (Sandbox Code Playgroud)

  • @BBLN 不是。这些函数采用一个 `sockaddr` 指针,因为它们自创建以来就一直这样做。 (2认同)