11

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

4

3 回答 3

14

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

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

一种方法是获取 IPv6 链路本地地址,枚举接口,如果只有一个匹配使用该接口,如果有多个匹配,则使用接口列表退出,并让用户以完整形式指定哪一个。

于 2010-03-19T10:12:15.687 回答
3

仅当您对链接本地地址进行硬编码时才会出现此问题,这对于重要的应用程序来说并不是真正的实用解决方案。

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

于 2010-03-17T13:12:37.817 回答
3

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

if_nametoindex(const char *ifname);
于 2012-03-21T01:58:26.547 回答