java - jmdns 在 IPv4 接口(interface)上注册,但广播 IPv6

标签 java android networking jmdns

所以我尝试在 Android 3.2.1 (HTC Flyer) 上使用 jmdns,并且我正在使用 jmdns 进行服务发现。除了我的三台设备中的一台(其余设备工作正常)正在广播 IPv6 地址而不是 IPv4 外,一切都很好。这很奇怪,因为它们都通过 DHCP 连接到我的家庭网络,因此它们都被分配了 IPv4 地址。

所以我在我的设备上运行

    android.net.wifi.WifiManager wifi = (android.net.wifi.WifiManager) getSystemService(android.content.Context.WIFI_SERVICE);
    multicastLock = wifi.createMulticastLock("mylockthereturn");
    multicastLock.setReferenceCounted(true);
    multicastLock.acquire();
    try {
        jmdns = JmDNS.create();

        jmdns.registerServiceType(jmdnsType);
        String jmdnsName = /* Read from db */;
        serviceInfo = ServiceInfo.create(jmdnsType, huggler_id, server.getLocalPort(), " blah blah");

        jmdns.registerService(serviceInfo);
        Log.d(TAG, "JMDNS service registered on ip " + jmdns.getInterface());
    } catch (IOException e) {
        Log.e(TAG, "Error creating JMDNS service (" + e.getMessage() + ")");
        e.printStackTrace();
    }

它会打印出漂亮的 IPv4 IP,它实际上与我的网络分配的 IP 相匹配(成功)。

但是当我运行在其他设备上发现服务的代码时。

for(ServiceInfo si : jmdns.list(jmdnsType, 6000)) { // timeout: 6s
        if (si.getName().equals(jmdnsNAme))
            continue;
        try {
            Log.d(TAG, "Host has " + si.getInet4Addresses().length + "  v4 addresses. ");
            Log.d(TAG, "Host has " + si.getInet6Addresses().length + " v6 addresses. ");


}

当它发现 Flyer 时,它会准确显示一个 v6 地址。

任何人都可以提出可能发生的事情吗?

我正在使用 Jmdns 3.4.0(3.4.1 根本不起作用!)而且我是一个 zeroconf 新手。

更新:

一些新信息:

    D/Huggler ( 5691): Host has 0 v4 addresses. 
    D/Huggler ( 5691): Host has 1 v6 addresses. 
    D/Huggler ( 5691): Host IPv6 address is fe80::66a7:69ff:feeb:9083
    D/Huggler ( 5691): Host IPv6 hostname is fe80::66a7:69ff:feeb:9083
    D/Huggler ( 5691): Host is linklocal true

谁能帮忙解释一下?

最佳答案

遇到了同样的问题,但在调用 jmDNS.create 时传入 InetAddress 似乎可以解决问题。

所以尝试这样的事情:

WifiManager wifi =   (WifiManager)getActivity().getSystemService(android.content.Context.WIFI_SERVICE);
String ip = Formatter.formatIpAddress(wifi.getConnectionInfo().getIpAddress());
jmdns = JmDNS.create(InetAddress.getByName(ip));

关于java - jmdns 在 IPv4 接口(interface)上注册,但广播 IPv6,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14221088/

相关文章:

Java 扫描仪在读取文件时不工作

java - 删除文件后更新 View 适配器

来自 Maven ExceptionInInitializerError (IntelliJ IDEA 12) 的 Android 库

java - C# 相当于 Java 的 DataOutputStream?

java - 在opengl es 2.0中绘制纹理

java - 带有 PriorityBlockingQueue 的 NullPointerException

android - 如何创建自定义 TextView 背景 Android?

c# - 连接到连接到服务器的生物识别设备

python - 使用python绑定(bind)/连接到网络接口(interface)卡

Java8 Stream 作为一个整体映射到一个 Function