这个问题可以被视为我自己发布的previous one姐妹问题。当您想要将链接本地地址绑定到IPv6套接字时,需要设置sin6_scope_id
结构的sockaddr_in6
字段,这非常繁琐。我想知道是否有人可以按照良好做法提供解决方案。
答案 0 :(得分:11)
IPv6链路本地地址在节点上不是唯一的,它只对NIC是唯一的,这就是你必须指定scope-id的原因。换句话说,拥有多个具有完全相同IPv6地址的适配器是完全有效的。
这意味着您应该将范围ID或合适的文本格式(%eth0,%1)作为输入接收,您可以将其传递给getaddrinfo()
。
一种方法是接受IPv6链接本地地址,枚举接口,如果只有一个匹配使用它,如果有多个匹配,则使用接口列表进行救援并让用户指定完整的接口形式。
答案 1 :(得分:3)
只有在对链接本地地址进行硬编码时才会出现此问题,这对于一个非常重要的应用来说并不是一个实际的解决方案。
否则,您应该让sockaddr
从getifaddrs()
绑定,这将为您填写范围ID(例如,您可以允许您的用户指定接口名称,然后搜索getifaddrs()
返回的列表,用于查找与该接口关联的链接本地地址。)
答案 2 :(得分:3)
对于IPv6链路本地地址(fe80::/10
前缀),sin6_scope_id
结构中的sockaddr_in6
成员是接口号,您可以通过
if_nametoindex(const char *ifname);