Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
sockaddr如何在6中保存sockaddr\u存储或sockaddr\u?_C_Sockets_Posix - Fatal编程技术网

sockaddr如何在6中保存sockaddr\u存储或sockaddr\u?

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

我正在阅读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),两者都
为16字节。做出此假设的任何现有代码都需要
转换到IPv6时要仔细检查


但是它没有解释当sockaddr\u in6被强制转换为sockaddr时会发生什么情况。

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

还要注意的是,它总是指向正在传递的地址结构的指针,而不是无法工作的实际结构。所以你永远都不会

(struct sockaddr) a_in6_sockaddr
是吗

(struct sockaddr *) &a_in6_sockaddr

所以sockaddr是毫无意义的,我的意思是,如果函数改为使用void指针,它不会改变任何东西?@BBLN不是真的。这些函数使用
sockaddr
指针,这是因为它们自创建以来一直都是这样做的。