这个问题可以看作是我之前发布的那个问题的姐妹问题。当你想要将链路本地地址绑定到IPv6套接字时,需要设置sockaddr_in6
结构体的sin6_scope_id
字段,这非常繁琐。我想知道是否有人可以提供遵循良好实践的解决方案。
IPv6的本地链接地址在节点上不是唯一的,它只对NIC而言是唯一的,这就是为什么您必须指定范围标识符的原因。换句话说,使用完全相同的IPv6地址拥有多个适配器是完全有效的。
这意味着您应该将范围标识符或适当的文本形式(%eth0,%1)作为输入传递给getaddrinfo()
。
一种方法是输入IPv6本地链接地址,枚举接口,如果只有一个匹配,则使用该接口,如果有多个匹配,则退出并获取用户指定完整形式的接口列表。
对于IPv6链路本地地址(fe80::/10
前缀),sockaddr_in6
结构体中的sin6_scope_id
成员是接口号,可以通过以下方式获取该数字:
if_nametoindex(const char *ifname);
getifaddrs()
获取您的 sockaddr
来绑定,这将为您填写范围 ID(例如,您可以允许用户指定接口名称,然后通过 getifaddrs()
返回的列表搜索与该接口关联的链接本地地址)。