5

我做了一些东西来检索我输入的 URL 的 IP 地址。

InetAddress ip = InetAddress.getByName("www.fake.cao");
return ia.getHostAddress();

我还抛出了 UnknownHostException 来尝试捕获错误 URL 的错误。

问题是,www.fake.cao 被识别为真正的 URL 并返回给我一个不可用的 IP 地址,并且不会抛出异常。

谁能告诉我我能做些什么来捕捉这些自命不凡的 URL?

4

3 回答 3

2

问题是您的 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 可能会为不同的不存在的主机返回不同的地址,但至少会尝试解决该问题。

于 2013-03-18T00:07:56.433 回答
2

尝试打开一个指向该地址的套接字,如果该地址无效,则会抛出异常。

于 2013-03-17T22:35:33.970 回答
1

根据 IP 规范,地址 0.0.0.0 表示不可用、无效或未知的主机。如果您没有收到错误 URL 的异常,也许您可​​以检查 IP 地址。如果是 0.0.0.0,那么主机可能不存在。

如果你从你的 ISP 那里得到一些不存在的通用地址,那么也许你可以尝试执行手动 NS 查找。基本上,您必须重写 InetAddress 类中的整个代码。这将包括获取 DNS 服务器 IP 地址、打开一个套接字、发布 NS 查询和读取解析响应。

如果您不喜欢平台独立性,您可以使用 JNI 连接到平台 DNS 工具。nslookup.exe例如,对于 Windows。

于 2013-03-17T22:55:07.573 回答