2010-03-17 170 views

回答

10

IPv6鏈接本地地址在節點上不唯一,它只是NIC唯一的,這就是爲什麼您必須指定範圍ID。換句話說,具有完全相同的IPv6地址的多個適配器是完全有效的。

這意味着您應該輸入範圍代碼或合適的文本形式(%eth0,%1),您可以將其傳遞給getaddrinfo()

一種方法是引入IPv6鏈接本地地址,枚舉接口,如果只有一個匹配使用該接口,如果多於一個匹配,則使用接口列表進行救援,並讓用戶指定哪一個完整形式。

+0

鏈路本地地址是從它的路由前綴構成拿到這個號碼和接口的MAC地址。因此,如果同一主機上有多個適配器可用,則每個網絡適配器都有不同的鏈路本地地址。 – zeekvfu 2013-08-21 10:13:28

+1

@Zind您錯誤地認爲每個接口都有唯一的MAC地址。請參閱Sun硬件的反例。 – 2013-08-21 14:34:52

3

該問題僅出現在硬編碼鏈接本地地址時,對於非平凡應用程序來說這不是一個真正實用的解決方案。

否則,你應該讓你的sockaddrgetifaddrs()綁定,這將填好的範圍ID爲您(例如,你可以讓你的用戶指定接口名稱,然後搜索通過getifaddrs()返回的列表中找到與該接口關聯的鏈路本地地址)。

3

對於IPv6鏈路本地地址(fe80::/10前綴),該sin6_scope_id成員在結構是端口號,可以通過

if_nametoindex(const char *ifname); 
相關問題