AF_UNSPEC、AF_INET和AF_INET6之间的关系

如题所述

第1个回答  2022-07-15

socket(3SOCKET) 调用创建指定系列和指定类型的套接字。

如果未指定协议,则系统将选择支持所需套接字类型的协议。将返回套接字句柄。套接字句柄即为文件描述符。

family由 sys/socket.h 中定义的一个常量指定。名为 AF_suite 的常量指定要在解释名称时使用的地址格式:

其中,套接字类型在 sys/socket.h中定义。AF_INET6、AF_INET 和 AF_UNIX支持SOCK_STREAM、SOCK_DGRAM 或 SOCK_RAW 这些类型。

以下示例创建 Internet 系列的流套接字:

此调用生成流套接字。TCP 协议提供底层通信。在大多数情况下,将 protocol参数设置为缺省值 0。可以指定缺省协议之外的其他协议,如 高级套接字主题 中所述。

通俗来讲,即 ai_family参数指定调用者期待返回的套接口地址结构的类型。
它的值包括三种:AF_INET,AF_INET6和 AF_UNSPEC
如果指定AF_INET,那么函数就不能返回任何IPV6相关的地址信息;
如果仅指定了AF_INET6,则就不能返回任何IPV4地址信息。
AF_UNSPEC 则意味着函数返回的是适用于指定主机名和服务名且适合任何协议族的地址。

如果某个主机既有AAAA记录(IPV6)地址,同时又有A记录(IPV4)地址,那么AAAA记录将作为sockaddr_in6结构返回,而A记录则作为sockaddr_in结构返回;