2012-06-28 86 views
1

我想使用getaddrinfo()来读取所有地址(IPv4和IPv6)。 我的问题是getaddrinfo()是否返回列表中的IPv4地址后面的IPv6地址。 假设我将AF_UNSPEC传递给getaddrinfo()并使用双栈。getaddrinfo()会首先返回IPv6地址吗?

+0

测试时它会做什么?文件说什么?答案是“在订购产品时没有保证”。 – Romain

+4

排序目标地址的规则在[RFC 3484](http://www.ietf.org/rfc/rfc3484.txt)的第6部分详细介绍,但我不确定实际上遵循这个规则的典型'getaddrinfo()'实现。这些规则要求预测内核将使用哪个源地址来达到特定的目标地址,这又取决于查询内核以获取实际可用的源地址列表并找出如何定制内核的源地址选择算法。 'getaddrinfo()'实际上会达到这些长度吗? – Celada

回答

2

正如Celada所评论的,RFC 3484给出了返回结果的建议排序。

特别针对GNU libc,订单可以由/etc/gai.conf控制并定制为本地策略。

1

答案就在这里:

http://tools.ietf.org/html/rfc6724

操作系统应该(而且大多如此)遵循此标准或它的前一个版本。当getaddrinfo()选择目标地址时,如果应用程序没有绑定到特定的地址,内核会选择源地址。

默认情况下,全局本地IPv6地址优先于所有IPv4地址。

0

这实际上取决于名称服务器和操作系统。 getaddrinfo()从名称服务器获取DNS解析信息。如果您的名称服务器在IPv4地址之前排列IPv6地址,它将在IPv4地址之前返回IPv6地址。

默认情况下,IPv6地址的优先级高于IPv4地址。 @Pavel Simerda写道 - “默认情况下,全局本地IPv6地址优于所有IPv4地址。”