2012-06-28 83 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地址。」