使用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()
成功?
答案 0 :(得分:0)
传统上使用第一个条目。 DNS服务器利用它来平衡多个服务器之间的负载,即每次返回不同的顺序。所以你应该选择第一个,然后从那里继续,直到你成功连接。
答案 1 :(得分:0)
你应该按顺序循环遍历它们,每次尝试connect()
,直到任何一个成功或你耗尽列表。
答案 2 :(得分:0)
没有正式定义的订单,但除非你有充分的理由不按顺序尝试它们,跳过任何不符合你要求的订单(例如,错误的协议)。通常,DNS服务器会循环或以某种方式置换结果。 (您可能会看到,如果您连续多次运行测试或运行nslookup或在google.com上挖几次。)