我做了一些东西来检索我输入的 URL 的 IP 地址。
InetAddress ip = InetAddress.getByName("www.fake.cao");
return ia.getHostAddress();
我还抛出了 UnknownHostException 来尝试捕获错误 URL 的错误。
问题是,www.fake.cao 被识别为真正的 URL 并返回给我一个不可用的 IP 地址,并且不会抛出异常。
谁能告诉我我能做些什么来捕捉这些自命不凡的 URL?
问题是您的 ISP 为不存在的 DNS 域返回了一个虚假页面。这种(不好的)做法被称为 NXDOMAIN 重定向。
JRE 无法判断81.200.64.50
是 的实际 IP 地址www.fake.cao
,还是您的 ISP 注入的虚假页面。
除了实际尝试打开套接字并检查它是否连接(请注意,即使主机不存在,它也可以连接,例如,如果您尝试打开 HTTP 连接),您可能会比较该主机的返回 IP ,使用已知无效主机的返回 IP(例如does-not-exist.invalid
)。
InetAddress ip = InetAddress.getByName("www.fake.cao");
InetAddress fake;
try {
fake = InetAddress.getByName("does-not-exist.invalid");
} catch (UnknownHostException e) {
//www.fake.cao exists, but invalid does not
return ip;
}
if (Arrays.equals(ip.getAddress(),fake.getAddress())) {
//both ip and fake resolves to the same IP
throw new UnknownHostException();
}
//invalid does exist, but it is different from ip
return ip;
这种方法并不完整,因为您的 ISP 可能会为不同的不存在的主机返回不同的地址,但至少会尝试解决该问题。
尝试打开一个指向该地址的套接字,如果该地址无效,则会抛出异常。
根据 IP 规范,地址 0.0.0.0 表示不可用、无效或未知的主机。如果您没有收到错误 URL 的异常,也许您可以检查 IP 地址。如果是 0.0.0.0,那么主机可能不存在。
如果你从你的 ISP 那里得到一些不存在的通用地址,那么也许你可以尝试执行手动 NS 查找。基本上,您必须重写 InetAddress 类中的整个代码。这将包括获取 DNS 服务器 IP 地址、打开一个套接字、发布 NS 查询和读取解析响应。
如果您不喜欢平台独立性,您可以使用 JNI 连接到平台 DNS 工具。nslookup.exe
例如,对于 Windows。