2010-03-17 135 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); 
相关问题