C 带有fist NULL参数的getaddrinfo给出了第一个IPv4而不是IPv6

C 带有fist NULL参数的getaddrinfo给出了第一个IPv4而不是IPv6,c,sockets,udp,C,Sockets,Udp,我面临的问题与此OP相同: 虽然没有可以理解的答案,为什么getaddrinfo(NULL,…)withAI\u PASSIVE标志首先返回IPv4,然后返回IPv6 我面临着和这次行动一样的问题 什么问题?您和其他OP描述的行为在getaddrinfo()的行为文档中。如果只需要IPv6地址,则可以在传递给该函数的提示结构中指定该地址。如果您希望同时容纳IPv4和IPv6地址,则无法安全地假设它们返回的相对顺序。如果您喜欢(比如)IPv6,但愿意退回到IPv4,那么您至少有两个合理的选择: 请

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

虽然没有可以理解的答案,为什么
getaddrinfo(NULL,…)
with
AI\u PASSIVE
标志首先返回IPv4,然后返回IPv6

我面临着和这次行动一样的问题

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

  • 请求(仅)IPv6地址。如果这不会产生任何可用地址,则单独请求IPv4地址
  • 在不指定地址系列的情况下发出请求,只需准备扫描返回列表中过去的IPv4地址,以搜索可接受的IPv6地址
  • 无论哪种方式,正确使用
    getaddrinfo()
    总是要求您检查每个返回的地址,以确定它是否符合您的要求,直到您找到一个符合要求的地址,或者您耗尽了列表

    对于地址的顺序没有特别的“为什么”,除了C库的实现者选择如何做之外