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

标签 java ping

所以我一直在使用 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() 方法检查某个地址是否可达的方法。 这些方法的实现是 native 的,并尽力“ping” InetAddress 表示的地址。

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

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 协议(protocol)。这是 ping 内部使用的。推荐看THIS收集知识并继续进行。

发件人: Simone Bordet's Blog

关于java - isReachable 始终返回 true,无论 IP 地址是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11587271/

相关文章:

java.lang.ClassCastException : androidx. appcompat.widget.AppCompatImageButton 无法转换为 android.widget.Button

java - 在另一个方法的构造函数中初始化最终变量

java - Java 中的原始包装类是否被视为引用类型?

docker run --name 与 --hostname 作为命令行选项的区别(ping : bad address)

sockets - 在 Go 中实现 ICMP ping

java - 如何迭代任何 JComponent 的组件?

java - onClickListener 事件未在 TableLayout 和动态 n 行上触发

macos - IPv6 Mac OS X 10.6 ping 失败

php - Ping 服务器 + 进度条然后显示不同的 div

Docker容器始终处于退出状态