主机上的getaddrinfo()是否会返回多个IPv4地址?

时间:2012-07-17 13:56:02

标签: c++ sockets

我打电话给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地址的结果?我能想到的唯一原因可能是具有单独连接的多个设备,但我一半希望它只返回主连接的地址或它恰好使用的一个连接。

2 个答案:

答案 0 :(得分:5)

man page on getaddrinfo关注主题

链接列表可能具有多个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参数返回结构列表,而不是单个结构   结构,因为主机和   与hostservice和   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