无论IP地址是什么,isReachable都会返回true

时间:2012-07-20 21:38:56

标签: java ping

所以我一直在使用isReachable来“ping”我的java代码中的地址。这段代码是每个人似乎都在使用的:

    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。即使我把它改成空字符串。有什么想法吗?

1 个答案:

答案 0 :(得分:2)

通过java.net.InetAddress.isReachable()方法检查某个地址是否可访问的方法。 这些方法的实现是本机的,并试图尽力“ping”InetAddress表示的地址。

令人惊讶的是,Windows与java.net.InetAddress.isReachable()的Linux / Unix实现之间存在许多差异。

Windows虽然看起来很奇怪,却没有正式支持ICMP“ping”系统调用。因此,Java SE 5实现尝试在端口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 在内部使用的内容。建议您THIS收集知识并继续。

FROM: Simone Bordet's Blog