无法在Android上进行反向DNS查找

时间:2012-03-21 20:23:25

标签: android

我的Android设备连接到带有IP地址的Wifi网络。我在我的Linux计算机上对此IP地址进行了NS查找,并验证该IP地址是否有相应的主机名。

我有一段Java代码,在我的Windows PC上运行时确实可以反向DNS查找(返回主机名):

String dnSuffix;
String ipAddress = "10.228.59.217";
InetAddress inetAddr;
try {
    //inetAddr = InetAddress.getLocalHost();
    inetAddr = InetAddress.getByName(ipAddress);
    //System.out.println("inetAddr = " + inetAddr);
    Log.v(LOG_TAG, "inetAddr = " + inetAddr);
    if (inetAddr != null) {
        dnSuffix = inetAddr.getHostName();
        //System.out.println("dnSuffix is " + dnSuffix);
        Log.v(LOG_TAG,"dnSuffix is " + dnSuffix); 
    }
} catch (UnknownHostException e) {
    //System.out.println("Error getting DN suffix: " + e.getMessage());
    Log.v(LOG_TAG,"Error getting DN suffix: " + e.getMessage());
}

dnSuffix是Windows上预期的主机名。

但在Android上,它会返回一个IP地址而不是一个主机名,这表示它失败了。

我在我的应用中拥有了我认为需要的所有权限:

<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" ></uses-permission>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

我找到了这个文档:

  

getCanonicalHostName

     

public String getCanonicalHostName()

     

获取此IP地址的完全限定域名。最大的努力   方法,这意味着我们可能无法返回FQDN,具体取决于   底层系统配置。如果有安全管理员,这个   方法首先使用hostname调用其checkConnect方法,并将-1调用为   它的参数是看是否允许调用代码知道   此IP地址的主机名,即连接到主机。如果   不允许操作,它将返回文本表示   IP地址。

     

返回:

     

此IP地址的完全限定域名,或者如果是   安全检查,文本不允许操作   表示IP地址。

     

自:

     

1.4

     

另见:

     

SecurityManager.checkConnect(java.lang.String,int)

我也发现有人有类似的问题:

getCanonicalHostName returns an IP address

但没有解决方案。

任何人都可以提供任何帮助吗?

1 个答案:

答案 0 :(得分:0)

我真的不确定它是否可以工作,遵循2.3源(缩短)

inetAddr = InetAddress.getByName(ipAddress);
getByName(numeric) -> getAllByName/Impl(numeric) -> lookupHostByName(numeric)
return bytesToInetAddresses(getaddrinfo(host), host)[0]

host是数字字符串,然后在结果对象上调用getHostName()将返回主机(ip)