3

所以我一直在使用 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。即使我将其更改为空字符串。任何想法为什么?

4

1 回答 1

2

一种通过 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以收集知识并继续。

来自: Simone Bordet 的博客

于 2012-07-20T21:49:04.737 回答