我打电话给getaddrinfo()
如下:
addrinfo hints;
addrinfo* res = NULL;
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
hints.ai_flags = AI_PASSIVE;
getaddrinfo(NULL, "http", &hints, &res);
目前结果是否可能包含多个带有IPv4地址的结果?我能想到的唯一原因可能是具有单独连接的多个设备,但我一半希望它只返回主连接的地址或它恰好使用的一个连接。
答案 0 :(得分:5)
是
链接列表可能具有多个addrinfo结构的原因有多种,包括:网络主机是多宿主的,可通过多种协议访问(例如AF_INET和AF_INET6);或者多个套接字类型可以使用相同的服务(例如,一个SOCK_STREAM地址和另一个SOCK_DGRAM地址)。通常,应用程序应尝试按返回顺序使用地址。 getaddrinfo()中使用的排序函数在RFC 3484中定义;通过编辑/etc/gai.conf(从glibc 2.5开始可用),可以为特定系统调整顺序。
答案 1 :(得分:0)
我也有这种困惑,我做了一些研究。
引自 Linux编程接口
int getaddrinfo(const char * host , const char * service ,
const struct addrinfo * hints , struct addrinfo ** result );
result参数返回结构列表,而不是单个结构 结构,因为主机和 与
host
,service
和hints
。 例如,可以返回多个地址结构以用于 一台具有多个网络接口的主机。
我使用自己的域copyqwer.com
DNS设置:
Type Name Value TTL
A @ 23.106.150.74 600 seconds
A @ 111.222.17.173 600 seconds
和getaddrinfo
返回具有这两个不同ip地址的addr结构。
完整的例子。 https://onlinegdb.com/ry1cdoAKr
计算机上的输出(我不知道为什么我的本地计算机上没有UDP
输出,但这没关系)
/home/*****/CLionProjects/APUE/cmake-build-debug/APUE copyqwer.com http
flags canon family inet type stream protocol TCP
host copyqwer.com address 111.222.17.173 port 80
flags canon family inet type stream protocol TCP
host - address 23.106.150.74 port 80