我已经做了一些检索我输入的URL的IP地址的东西。
InetAddress ip = InetAddress.getByName("www.fake.cao");
return ia.getHostAddress();
我还抛出了UnknownHostException来尝试捕获错误的URL错误。
问题是,www.fake.cao被识别为真正的URL,并返回一个不可用的IP地址,并且不会抛出异常。
任何人都可以告诉我如何捕捉这些自命不凡的URL?
答案 0 :(得分:2)
尝试打开地址的套接字,如果地址无效,将抛出异常。
答案 1 :(得分:1)
根据IP规范,地址0.0.0.0表示不可用,无效或未知的主机。如果您没有收到错误URL的例外,也许您可以检查IP地址。如果它是0.0.0.0,那么主机可能不存在。
如果从ISP获得一些通用的不存在地址,那么也许您可以尝试执行手动NS查找。基本上你必须重写InetAddress类中的整个代码。这将包括获取DNS服务器IP地址,打开它的套接字,发布NS查询并阅读解析响应。
如果您不是平台独立性,则可以使用JNI连接到平台DNS工具。例如,nslookup.exe
用于Windows。
答案 2 :(得分:1)
问题是您的ISP会为不存在的DNS域返回虚假页面。 (坏)练习称为NXDOMAIN重定向。
JRE无法判断81.200.64.50
是www.fake.cao
的实际IP地址,还是您的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可能会为不同的不存在的主机返回不同的地址,但至少会尝试解决此问题。