2

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

4

2 回答 2

6

是的。

getaddrinfo 上的手册页有以下关于该主题的内容

链表可能具有多个 addrinfo 结构的原因有多种,包括: 网络主机是多宿主的,可通过多种协议访问(例如,AF_INET 和 AF_INET6);或者可以从多种套接字类型(例如,一个 SOCK_STREAM 地址和另一个 SOCK_DGRAM 地址)获得相同的服务。通常,应用程序应尝试按照返回的顺序使用地址。getaddrinfo() 中使用的排序函数在 RFC 3484 中定义;可以通过编辑 /etc/gai.conf(自 glibc 2.5 起可用)来调整特定系统的顺序。

于 2012-07-17T13:57:47.803 回答
0

我也有这种困惑,我做了一些研究。

引自Linux 编程接口

int getaddrinfo(const char * host , const char * service ,
const struct addrinfo * hints , struct addrinfo ** 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返回具有这 2 个不同 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
于 2019-10-24T04:27:28.117 回答