Java中的isReachable看起来并没有像预期的那样工作

时间:2010-05-05 22:31:17

标签: java clojure ping inetaddress

我正在使用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。我想我一定是做错了,但谷歌的研究告诉我的不同之处。我很困惑!

2 个答案:

答案 0 :(得分:3)

更新以回应评论错误:

使用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下面的评论表明关于echo服务的部分是错误的,错误的错误:

  

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

在这些情况下,我使用WireShark,tcpdump(Windows上的WinDump)或snoop(Solaris)等数据包嗅探器来确认线路上发生的事情。

答案 1 :(得分:1)

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