java - 从 IP 查找主机名 - 反向 DNS - android
问题描述
我正在尝试从我的 android 应用程序的子网(反向 DNS)中的 IP 地址中查找主机名。我一直无法找到一种适用于相当数量的路由器的方法。
迄今为止尝试的方法
获取CanonicalHostName
适用于某些路由器。在其余部分不起作用,只返回 IP。
DNSJava 库。
我尝试了下面的代码,它也适用于某些情况,但不适用于其他路由器。
String getHostNameUsingDNSJavaLibrary( String ipAddress ) { try { Name reverseipAddress = ReverseMap.fromAddress( ipAddress ); Log.e( TAG ,"reverseipAddress="+ reverseipAddress ); Record[] records; Lookup lookup = new Lookup( reverseipAddress, Type.PTR ); SimpleResolver resolver = new SimpleResolver(); resolver.setAddress( InetAddress.getByName( ModemIPAddress ) ); lookup.setResolver( resolver ); records = lookup.run(); if ( lookup.getResult() == Lookup.SUCCESSFUL ) { for (int i = 0; i < records.length; i++) { if( records[i] instanceof PTRRecord ) { PTRRecord ptr = (PTRRecord) records[i]; return records[0].rdataToString(); } } } else { Log.e( TAG ,"Failed lookup"+ lookup.getResult() ); } } catch(Exception e) { Log.e( TAG ,"Exception: " + e); } return ipAddress;
}
Linux 命令
我曾尝试在 android linux 终端上运行 nslookup、host、dig 等命令,但这些命令不起作用。例如:OnePlus5T:/ $ dig -x
/system/bin/sh: 挖掘:无法访问或未找到
像 fing 这样的应用程序做得更好。即使 fing 无法找到网络中设备的所有主机名,但它比我能够完成的要好得多。有类似的问题Can't do reverse DNS lookup on Android但还没有令人信服的答案。
任何有助于使其变得更好的帮助表示赞赏。
解决方案
请尝试以下操作:
inetAddr = InetAddress.getByName(ipAddress);
inetAddr.getHostName();
由于 .getHostName() 会触发网络操作,因此您必须确保不会在主/UI 线程中调用该方法。另请注意,可能存在没有分配任何主机名的 IP 地址(尤其是在本地网络中)。
推荐阅读
- typo3 - 如何在 TSConfig addToList 中使用多行而不是线性列表?
- r - 我该如何解决“package 'ddply' is not available (for R version 3.6.2)”
- ios - Firebase Firestore 上传方法比其他方法花费的时间要长得多
- python - Python:拆分(子)字符串分隔符,但不是在大括号内?
- datetime - 为什么即使未指定 strptime() 也会附加时间值?
- python - Django在markdown中包含模板
- java - 如何将 2 个不同类的 2 个不同的数组列表组合成不同类的新数组列表?
- c# - 在数组/列表/哈希表中查找空槽或在字典中查找空值的最快方法
- javascript - 为什么我的 React 应用总是无法编译?
- reactjs - 尝试访问样式化组件中的自定义道具