Java isReachable始终返回true,无论IP地址是什么
因此,我一直在java代码中使用isReachable to“ping”一个地址。这段代码似乎是每个人都在使用的:Java isReachable始终返回true,无论IP地址是什么,java,ping,Java,Ping,因此,我一直在java代码中使用isReachable to“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 can
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表示的地址 令人惊讶的是,
java.net.InetAddress.isReachable()
的Windows和Linux/Unix实现之间存在许多差异
看起来很奇怪的是,Windows并不正式支持ICMP“ping”系统调用。因此,JavaSE5实现尝试在端口7(echo服务)上打开一个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在内部使用的。建议参见收集知识并继续
发件人:您使用的是Java 1.5吗?已打开错误报告:。现在已经解决了,所以如果您使用的是1.5.Hi,请尝试使用更新的Java版本,这是一个好的评论,我同意其中的大部分,除了“事实证明,在Linux/Unix中,ping系统调用需要root权限,因此大多数情况下Java.net.InetAddress.isReachable()将失败,因为许多Java程序都不是以root身份运行的”。事实上,正如您前面所写的,它将退回到使用TCP端口7(echo服务)的检查。但为此,防火墙需要开放,dst也需要支持Echo。