Android 我应该为“你好”使用哪个IPv6地址?

Android 我应该为“你好”使用哪个IPv6地址?,android,ipv6,bonjour,jmdns,Android,Ipv6,Bonjour,Jmdns,在我的一个安卓应用程序中,我使用JmDNS来获得“你好”支持。启动时,我为NetworkInterface中的每个InetAddress创建一个JmDNS实例。所以代码看起来像: for(InetAddress addr : addresses) { JmDNS jmdns = JmDNS.create(addr, "SomeName"); } 到目前为止,这一切都运行得很好,通过对v4和v6地址执行此操作,我能够从其他客户端(例如,在iOS上)正确地查看所有内容 但是,使用IPv6,

在我的一个安卓应用程序中,我使用JmDNS来获得“你好”支持。启动时,我为NetworkInterface中的每个InetAddress创建一个JmDNS实例。所以代码看起来像:

for(InetAddress addr : addresses) {
    JmDNS jmdns = JmDNS.create(addr, "SomeName");
}
到目前为止,这一切都运行得很好,通过对v4和v6地址执行此操作,我能够从其他客户端(例如,在iOS上)正确地查看所有内容

但是,使用IPv6,一个网络适配器实际上可以与多个v6地址关联。例如,我的一名测试人员向我发送了一份带有以下网络设置的“错误报告”(我更改了一些数字以防止信息泄漏-希望它不会改变其含义):

从这个输出来看,两个IPv6地址实际上非常相似,一个是本地链路,另一个不是。通过阅读,我发现在IPv6中,所有接口实际上也必须有一个链接本地地址

然而,我对这两种方法中的哪一种真正用于我的JmDNS注册感到困惑。如果我同时注册这两个日志,我会得到一个恒定的日志流,其中显示:

从我们这里得到了相互矛盾的调查 传入:[x@123456789类型:type_SRV index 33,class:class_在索引1中,名称:something.\u tcp.local.ttl:'3599/3600'服务器:'sometname.local:'5000']


那么我应该使用哪一种呢?是否有一些一般规则来决定组中哪些地址要注册?

答案是这四位

环回对你好不好,所以消除环回。对于Bonjour,您需要一个localish地址,因为Bonjour本质上是localish,但如果有多个以太网,您可能需要所有以太网。因此,我建议,如果有一个sitelocal地址,您可以使用该地址,否则使用linklocal地址。linklocal保证会在那里


当您获得地址时,请注意它的首选\u lft(即新连接的生存期,现有连接的有效\u lft也更长),并设置一个计时器在该时间段后重新注册。

因此,如果我理解正确,您的意思是,在这种情况下,我应该注册第一个和第三个地址,而忽略第二个地址。是吗?@yydl因为您只与链路上的设备通话,那么是的,您只需要使用链路本地IPv6地址。
- ip: /fe80::b4a:8eff:fe91:b1bb%mlan0
isLoopBack: false
isLinkLocal: true
isAnyLocal: false
isSiteLocal: false

- ip: /1234:d000:1234:d1:b4a:8eff:fe91:b1bb
isLoopBack: false
isLinkLocal: false
isAnyLocal: false
isSiteLocal: false

- ip: /10.0.1.5
isLoopBack: false
isLinkLocal: false
isAnyLocal: false
isSiteLocal: true