如何将链路本地地址绑定到ipv6套接字

时间:2010-03-17 08:58:16

标签: c ipv6

这个问题可以被视为我自己发布的previous one姐妹问题。当您想要将链接本地地址绑定到IPv6套接字时,需要设置sin6_scope_id结构的sockaddr_in6字段,这非常繁琐。我想知道是否有人可以按照良好做法提供解决方案。

3 个答案:

答案 0 :(得分:11)

IPv6链路本地地址在节点上不是唯一的,它只对NIC是唯一的,这就是你必须指定scope-id的原因。换句话说,拥有多个具有完全相同IPv6地址的适配器是完全有效的。

这意味着您应该将范围ID或合适的文本格式(%eth0,%1)作为输入接收,您可以将其传递给getaddrinfo()

一种方法是接受IPv6链接本地地址,枚举接口,如果只有一个匹配使用它,如果有多个匹配,则使用接口列表进行救援并让用户指定完整的接口形式。

答案 1 :(得分:3)

只有在对链接本地地址进行硬编码时才会出现此问题,这对于一个非常重要的应用来说并不是一个实际的解决方案。

否则,您应该让sockaddrgetifaddrs()绑定,这将为您填写范围ID(例如,您可以允许您的用户指定接口名称,然后搜索getifaddrs()返回的列表,用于查找与该接口关联的链接本地地址。)

答案 2 :(得分:3)

对于IPv6链路本地地址(fe80::/10前缀),sin6_scope_id结构中的sockaddr_in6成员是接口号,您可以通过

获取此号码
if_nametoindex(const char *ifname);