2011-05-12 130 views
1

我在尋找一個以IPv6地址作爲參數並返回域名的函數。IPv6地址到域名

要說清楚,2a00:1450:8006 :: 68會返回ipv6.google.com。

(目的是給這個域名getaddrinfo函數)。

感謝:-)

EDIT1:我試過getaddrinfo("2a00:1450:8006::68", "http", NULL, &result);,則返回「地址系列主機不支持」和getaddrinfo("ipv6.google.com", "http", NULL, &result);返回錯誤「沒有地址與熱名稱關聯」。

EDIT2:我同意你的看法,我已經與IPV6系統的麻煩,我已經試過http://test-ipv6.com/,看來,我沒有IPV6 ADRESS但ifconfig它返回:

adr inet6: fe80::15b:fcff:fe65:d516/64 Scope:Lien 
+2

似乎是一個迂迴的方式來獲取我的地址結構。爲什麼不把「2a00:1450:8006 :: 68」傳遞給'getaddrinfo'? – Santa 2011-05-12 23:00:28

+1

這聽起來像您的機器和/或網絡不支持IPv6 - 它應該工作嗎? – 2011-05-12 23:10:59

+0

不知道你的代碼,但我應該提到2a00:1450:8006 :: 68實際上沒有反向DNS。如果您實際嘗試使用具有反向DNS的IPv6地址,這將有所幫助。 – 2011-05-13 12:47:22

回答

1

我想您沒有有效的IPv6配置。 getaddrinfo()只會返回可達的IPv6答案,因此如果您的系統沒有全球範圍的IPv6地址和到達解析地址的路由,結果將從結果集中刪除。

其基本思想是您只需撥打getaddrinfo一次並獲取要連接的地址列表 - 如果該列表包含無法訪問的地址,則在嘗試另一個地址之前,程序必須首先運行超時。

「不支持主機名的地址族」表示它已經認識到該地址是不需要通過DNS解析的IPv6地址,因此它會嘗試將其與允許的地址系列列表進行匹配,失敗並返回錯誤。

解析主機名將嘗試獲取主機名的「A」記錄,因爲這適用於本地支持的唯一地址系列。不存在這樣的記錄,因此它返回沒有記錄存在的信息。由於它從未要求IPv6地址(這是毫無意義的),因此它不會抱怨地址系列不匹配。

+0

我認爲你對發生的事情是正確的,但我也認爲這是一個錯誤。您所描述的行爲只有在提示中設置了'AI_ADDRCONFIG'時纔會發生。 – 2011-05-12 23:30:10

+1

@R .:對於glibc,提供'hints'作爲'NULL'相當於'ai_family = AF_SPEC'和'ai_flags = AI_V4MAPPED | AI_ADDRCONFIG'。這似乎違背了POSIX規範。 – caf 2011-05-13 00:52:51

+0

什麼是AF_SPEC? – 2011-05-13 01:01:53

2

你是第一步使用getaddrinfo的權利,但它不能爲你做reverse-dns查找。您需要使用getaddrinfo將地址的字符串格式轉換爲sockaddr,然後您可以將該地址傳遞給getnameinfo進行反向查找。

就這樣說,我認爲卡爾的評論也是相關的。看起來你的系統配置爲不支持IPv6 ...