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

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

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

这意味着您应该将您可以传递给getaddrinfo()的scope-id或合适的文本格式(%eth0,%1)作为输入。

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

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

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

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

 if_nametoindex(const char *ifname);