第一个NULL参数的getaddrinfo提供第一个IPv4而不是IPv6

时间:2019-04-30 14:24:28

标签: c sockets udp

我正面临与此OP相同的问题:getaddrinfo sorting IPv4 before IPv6 for localhost?

尽管没有可以理解的答案,为什么带有getaddrinfo(NULL, ...)标志的AI_PASSIVE返回第一个IPv4,然后返回IPv6?

1 个答案:

答案 0 :(得分:1)

  

我正面临与此OP相同的问题

什么问题?您和另一个OP描述的行为在getaddrinfo()记录的行为之内。如果只需要IPv6地址,则可以在传递给该函数的提示结构中指定该地址。如果要同时容纳IPv4和IPv6地址,则无法安全地假设它们将被返回的相对顺序。如果您喜欢(例如)IPv6,那么您至少有两个合理的选择,但又愿意使用IPv4:

  1. 请求(仅)IPv6地址。如果那不能产生任何可用的地址,则单独请求IPv4地址。
  2. 在不指定地址族的情况下发出请求,只需准备扫描返回列表中的过去IPv4地址以寻找可接受的IPv6地址。

无论哪种方式,正确使用getaddrinfo() 总是都要求您检查每个返回的地址,以确定其是否满足您的要求,直到找到满足要求的地址或用尽列表。< / p>

除了简单地选择C库的实现者选择执行操作的方式之外,地址的顺序没有特别的“为什么”。

相关问题