sockaddr如何在6中保存sockaddr\u存储或sockaddr\u?
我正在阅读Beej的指南,他谈到了程序员创建的不同结构。 他说我们可以将sockaddr_storage/in6/in传递给addrinfo,它将被转换为sockaddr, 但这到底是怎么可能的呢?sockaddr为16字节,而sockaddru in 6为28字节 我读了RFC 3493的一小部分: 请注意,sockaddr_in6结构通常会大于sockaddr如何在6中保存sockaddr\u存储或sockaddr\u?,c,sockets,posix,C,Sockets,Posix,我正在阅读Beej的指南,他谈到了程序员创建的不同结构。 他说我们可以将sockaddr_storage/in6/in传递给addrinfo,它将被转换为sockaddr, 但这到底是怎么可能的呢?sockaddr为16字节,而sockaddru in 6为28字节 我读了RFC 3493的一小部分: 请注意,sockaddr_in6结构通常会大于 通用的sockaddr结构。在许多现有的实现中 sizeof(struct sockaddr_in)等于sizeof(struct sockaddr
通用的sockaddr结构。在许多现有的实现中 sizeof(struct sockaddr_in)等于sizeof(struct sockaddr),两者都
为16字节。做出此假设的任何现有代码都需要
转换到IPv6时要仔细检查
但是它没有解释当sockaddr\u in6被强制转换为sockaddr时会发生什么情况。请记住,所有采用
struct sockaddr
指针的函数也采用结构的大小。与实际套接字上的元数据一起,系统很容易知道您传递的是什么样的结构
还要注意的是,它总是指向正在传递的地址结构的指针,而不是无法工作的实际结构。所以你永远都不会
(struct sockaddr) a_in6_sockaddr
是吗
(struct sockaddr *) &a_in6_sockaddr
所以sockaddr是毫无意义的,我的意思是,如果函数改为使用void指针,它不会改变任何东西?@BBLN不是真的。这些函数使用
sockaddr
指针,这是因为它们自创建以来一直都是这样做的。