首页 > 解决方案 > 从 IP 查找主机名 - 反向 DNS - android

问题描述

我正在尝试从我的 android 应用程序的子网(反向 DNS)中的 IP 地址中查找主机名。我一直无法找到一种适用于相当数量的路由器的方法。

迄今为止尝试的方法

  1. 获取CanonicalHostName

    适用于某些路由器。在其余部分不起作用,只返回 IP。

  2. 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;
    

    }

  3. Linux 命令

    我曾尝试在 android linux 终端上运行 nslookup、host、dig 等命令,但这些命令不起作用。例如:OnePlus5T:/ $ dig -x

    /system/bin/sh: 挖掘:无法访问或未找到

像 fing 这样的应用程序做得更好。即使 fing 无法找到网络中设备的所有主机名,但它比我能够完成的要好得多。有类似的问题Can't do reverse DNS lookup on Android但还没有令人信服的答案。

任何有助于使其变得更好的帮助表示赞赏。

标签: javaandroidreverse-dns

解决方案


请尝试以下操作:

inetAddr = InetAddress.getByName(ipAddress);
inetAddr.getHostName();

由于 .getHostName() 会触发网络操作,因此您必须确保不会在主/UI 线程中调用该方法。另请注意,可能存在没有分配任何主机名的 IP 地址(尤其是在本地网络中)。


推荐阅读