所以我一直在使用 isReachable 在我的 java 代码中“ping”一个地址。这段代码似乎是每个人都使用的:
try
{
InetAddress address = InetAddress.getByName("172.16.2.0");
// Try to reach the specified address within the timeout
// periode. If during this periode the address cannot be
// reach then the method returns false.
boolean reachable = address.isReachable(10000);
System.out.println("Is host reachable? " + reachable);
} catch (Exception e)
{
e.printStackTrace();
}
我的问题是,无论我使用什么 IP 地址,它总是返回 true。即使我将其更改为空字符串。有什么想法吗?
一种通过 java.net.InetAddress.isReachable() 方法检查某个地址是否可达的方法。
这些方法的实现是本机的,并尝试尽最大努力“ping”InetAddress 表示的地址。
令人惊讶的是,Windows 和 Linux/Unix 的实现之间存在许多差异java.net.InetAddress.isReachable()
.
Windows,虽然看起来很奇怪,但并不正式支持 ICMP“ping”系统调用。因此,Java SE 5 实现尝试在端口 7(回显服务)上打开 TCP 套接字,并希望获得某种回复。
相反,Linux/Unix 支持 ICMP“ping”系统调用。因此 java.net.InetAddress.isReachable() 的实现首先尝试执行“ping”系统调用;如果失败,它将回退尝试在端口 7 上打开 TCP 套接字,就像在 Windows 中一样。
事实证明,在Linux/Unix中,ping系统调用需要root权限,因此大多数时候java.net.InetAddress.isReachable()会失败,因为许多Java程序不是以root身份运行的。
正确的做法是ICMP协议。这是什么ping内部使用。推荐看THIS http://web.archive.org/web/20130820071442/http://0x13.de/index.php/code-snippets/74-icmp-ping-in-java.html收集知识并继续。
FROM: 西蒙娜·博代的博客 http://bordet.blogspot.com.br/2006/07/icmp-and-inetaddressisreachable.html
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)