Java isReachable始终返回true,无论IP地址是什么

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

因此,我一直在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 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。