【问题标题】:isReachable in Java doesn't appear to be working quite the way it's supposed toJava 中的 isReachable 似乎并没有按照预期的方式工作
【发布时间】:2010-05-05 22:31:16
【问题描述】:

我正在使用 Clojure,但我可以阅读 Java,所以这不是 Clojure 特定的问题。这甚至似乎不适用于 Java。

我正在尝试使用 isReachable 实现一些“ping”功能。我使用的代码是这样的:

(.isReachable (java.net.InetAddress/getByName "www.microsoft.com") 5000)

由我的一个好朋友翻译成Java:

public class NetTest {
  public static void main (String[] args) throws Exception{
    String host = "acidrayne.net";
    InetAddress a = InetAddress.getByName(host);

    System.out.println(a.isReachable(10000));
  }
}

这两个都返回 false。我想我一定是做错了,但谷歌研究告诉我不同​​。我很困惑!

【问题讨论】:

  • 你能从运行它的机器上 ping acidrayne.net 吗?
  • 我可以通过ping -c 1 acidrayne.net ping acidrayne.net,但不能通过上面发布的代码。这是在任何机器上。

标签: java clojure ping inetaddress


【解决方案1】:

针对错误的评论进行了更新:

使用 Unix/Linux??

http://bordet.blogspot.com/2006/07/icmp-and-inetaddressisreachable.html 说:

相反,Linux/Unix 支持 ICMP“ping”系统调用。所以java.net.InetAddress.isReachable()的实现首先尝试执行“ping”系统调用**;如果失败,它回退并尝试在 [sic - to] 端口 7 上打开 TCP 套接字,就像在 Windows 中一样。

事实证明,在 Linux/Unix 中 ping 系统调用需要 root 权限,所以大多数时候 java.net.InetAddress.isReachable() 会失败,因为许多 Java 程序没有运行作为 root,并且因为目标地址不太可能启动并运行 echo 服务。太糟糕了。

@EJP下面的评论表明关于回显服务的部分是错误的,错误的错误:

这是不正确的。如果 isReachable 在尝试连接到端口 7 时遇到 ConnectException,则返回 true,因为这证明主机已启动并能够发送 RST 段。

在这种情况下,我会使用 WireShark、tcpdump(Windows 上的 WinDump)或 snoop (Solaris) 等数据包嗅探器来确认网络上实际发生的情况。

【讨论】:

  • 这是不正确的。如果 isReachable 在尝试连接端口 7 时遇到 ConnectException,则返回 true,因为这证明主机已启动并能够发送 RST 段。
  • @EJP - 感谢您的更正 - 我对互联网博客文章的表面价值不满意。我更新了答案,但稍后我可能会完全删除答案。既然我更新了,对它的赞成票应该可以收回。
  • 我不在乎你是否“有点不正确”。您的答案很准确,如果我以 root 身份运行它就可以正常工作(在这种情况下这是不可能的)。 isReachable 无法在我或朋友的计算机上运行,​​除了 localhost 和它出现的其他机器。
  • @Rayne - 谢谢。我会留下它,因为它确实为您提供了部分答案。很高兴知道您的系统到底发生了什么。 ping 是否失败(对特权执行)并且没有回退到尝试 echo 服务?或者 ping 是否失败,它确实回退到 echo 服务,但 echo“失败”(甚至没有处理 RST,因为主机存在)。由于据报道它适用于其他人,因此可能是版本问题或特定于操作系统的问题。
  • 我认为 ping 失败是由于缺少权限,并且 acidrayne 上的 echo 服务也失败了。它适用于很多站点(包括这个站点),并且其他几个人尝试以相同的方式 ping acidrayne,但失败了。 acidrayne 托管在共享的 hostgator 服务器上。我不知道为什么它不起作用。不过没关系。
【解决方案2】:

我认为正确的答案实际上并不正确。 Microsoft.com 只是忽略 ICMP 请求,可能是为了避免基本的 ping 洪水攻击。至于第二台主机,我不知道 ping 可能是什么问题,但我使用的是 GNU/Linux,并且 isReachable 工作得很好。

【讨论】:

  • 如果我以 root 身份运行它,它工作得很好,而一个朋友遇到了完全相同的事情,所以我相当肯定他的回答至少在这一点上是正确的。
  • 也许是这样。我不是专家,我只是说在 Linux 下使用 isReachable() 而不是 root 运行代码对某些主机有效...
猜你喜欢
  • 2020-09-15
  • 2016-01-24
  • 1970-01-01
  • 2022-12-17
  • 1970-01-01
  • 1970-01-01
  • 2013-11-29
  • 2021-06-07
  • 2013-02-10
相关资源
最近更新 更多