我的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
但没有解决方案。
任何人都可以提供任何帮助吗?
答案 0 :(得分:0)
我真的不确定它是否可以工作,遵循2.3源(缩短)
inetAddr = InetAddress.getByName(ipAddress);
getByName(numeric) -> getAllByName/Impl(numeric) -> lookupHostByName(numeric)
return bytesToInetAddresses(getaddrinfo(host), host)[0]
host是数字字符串,然后在结果对象上调用getHostName()将返回主机(ip)