怎么处理getaddrinfo的结果?

时间:2014-08-15 18:26:19

标签: sockets unix getaddrinfo

使用getaddrinfo查询主机,我得到了许多结果:

struct addrinfo hints;
hints.ai_flags    = 0
hints.ai_family   = AF_INET;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = 0
hints.ai_addrlen  = 0;
hints.ai_addr     = NULL;
hints.ai_canonname= NULL;
hints.ai_next     = NULL;

struct addrinfo *res = NULL;
getaddrinfo("google.com", "http", &hints, &res);

res填入了一个包含11个可能地址的列表,我可以使用这些地址连接到google.com给定参数:

1   family=2, addr.port=80, addr.address=74.125.226.98, protocol=6, socktype=1, flags=0
2   family=2, addr.port=80, addr.address=74.125.226.104, protocol=6, socktype=1, flags=0
3   family=2, addr.port=80, addr.address=74.125.226.100, protocol=6, socktype=1, flags=0
4   family=2, addr.port=80, addr.address=74.125.226.99, protocol=6, socktype=1, flags=0
5   family=2, addr.port=80, addr.address=74.125.226.96, protocol=6, socktype=1, flags=0
6   family=2, addr.port=80, addr.address=74.125.226.102, protocol=6, socktype=1, flags=0
7   family=2, addr.port=80, addr.address=74.125.226.110, protocol=6, socktype=1, flags=0
8   family=2, addr.port=80, addr.address=74.125.226.97, protocol=6, socktype=1, flags=0
9   family=2, addr.port=80, addr.address=74.125.226.105, protocol=6, socktype=1, flags=0
10  family=2, addr.port=80, addr.address=74.125.226.103, protocol=6, socktype=1, flags=0
11  family=2, addr.port=80, addr.address=74.125.226.101, protocol=6, socktype=1, flags=0

我的问题是,我使用哪个?我应该总是拿第一个,还是随机选一个?或者我应该按顺序尝试每一个,直到connect()成功?

3 个答案:

答案 0 :(得分:0)

传统上使用第一个条目。 DNS服务器利用它来平衡多个服务器之间的负载,即每次返回不同的顺序。所以你应该选择第一个,然后从那里继续,直到你成功连接。

答案 1 :(得分:0)

你应该按顺序循环遍历它们,每次尝试connect(),直到任何一个成功或你耗尽列表。

答案 2 :(得分:0)

没有正式定义的订单,但除非你有充分的理由不按顺序尝试它们,跳过任何不符合你要求的订单(例如,错误的协议)。通常,DNS服务器会循环或以某种方式置换结果。 (您可能会看到,如果您连续多次运行测试或运行nslookup或在google.com上挖几次。)

https://en.wikipedia.org/wiki/Round-robin_DNS