【问题标题】:What to do with the results of getaddrinfo?如何处理 getaddrinfo 的结果?
【发布时间】:2014-08-15 18:26:19
【问题描述】:

使用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() 成功?

【问题讨论】:

    标签: sockets unix getaddrinfo


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        您应该依次遍历它们,一次一个,尝试 connect() 到每一个,直到其中一个成功或您用尽列表。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-12-06
          • 2020-05-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-08-11
          • 1970-01-01
          相关资源
          最近更新 更多