如何在 Android 中使用 mDNS 从“.local”解析 Ipv4 和 Ipv6

Tan*_*jan 5 android mdns multicast ipv4 ipv6

我正在尝试使用多播 DNS 从“.local”解析 IPv4 和 IpV6,我尝试了https://github.com/posicks/mdnsjava但它无法解析所需的 ipv4/ipv6。或者,我找到了一个适合我的应用程序,但不知道它是如何工作的。

应用程序链接: https://play.google.com/store/apps/details? id=com.dokoden.dotlocalfinder

另外,我尝试使用Linux“终端 -
用于解析 ipv4 的命令”用于 avahi-resolve-host-name abc.local -4
解析 ipv6 的命令来解析 “.local” avahi-resolve-host-name abc.local -6
,并且已成功解析。

我在 Android 中尝试了相同的命令来解析“.local”,但得到Cannot run program “avahi-resolve-host-name”: error=13, Permission returned

我正在 Android 中尝试这段代码 -

  Process process = Runtime.getRuntime().exec("avahi-resolve-host-name abc.local -4");
  BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));
  Log.d("OutPut",in.readLine());
Run Code Online (Sandbox Code Playgroud)

Tan*_*jan 2

最后,我成功了。

我使用mdnsjava依赖项解析了 Ipv4 和 Ipv6

implementation "xyz.gianlu.mdnsjava:mdnsjava:2.2.1"
Run Code Online (Sandbox Code Playgroud)

为了解析 Ipv4,我使用这个代码片段

for (Record record : new Lookup(localName, Type.A, DClass.IN).lookupRecords()) {
   if (record.getType() == Type.A) {
       ((ARecord) record).getAddress().getHostAddress();
       }
    }
Run Code Online (Sandbox Code Playgroud)

在编写此代码片段之前,您必须使用以下命令将 MuticastLock 放在连接的 Wifi 上

  WifiManager.MulticastLock multicastLoc = wifiManager.createMulticastLock("mDnsLock");
  multicastLoc.setReferenceCounted(true);
  multicastLoc.acquire();
Run Code Online (Sandbox Code Playgroud)

并在获取ip后释放multicastLock。

对于 Ipv6,我仅在此处使用相同的 Ipv4 代码片段,记录类型应Type.AAAA代替Type.A

此代码适用于 Android 10。