首页 > 解决方案 > 带有第一个 NULL 参数的 getaddrinfo 给出第一个 IPv4 而不是 IPv6

问题描述

我面临与此 OP 相同的问题:getaddrinfo 在 IPv6 之前为 localhost 排序 IPv4?

虽然没有可以理解的答案,但为什么getaddrinfo(NULL, ...)with AI_PASSIVEflag 先返回 IPv4 然后再返回 IPv6?

标签: csocketsudp

解决方案


我面临与此 OP 相同的问题

什么问题?您和其他 OP 描述的行为在getaddrinfo(). 如果您只想要 IPv6 地址,那么您可以在传递给该函数的提示结构中指定它。如果您想同时容纳 IPv4 和 IPv6 地址,那么您不能安全地假设它们将被返回的相对顺序。如果您更喜欢(比如说)IPv6,但愿意回退到 IPv4,那么您至少有两个合理的选择:

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

无论哪种方式,正确使用getaddrinfo() 总是需要您检查每个返回的地址以确定它是否符合您的要求,直到您找到一个符合要求或您用尽列表。

地址的顺序没有特别的“为什么”,除了简单的 C 库的实现者选择做事的方式。


推荐阅读