Java中的isReachable看起来并不像它应该的那样工作

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

我正在尝试使用isReachable实现一些’ping’function。 我正在使用的代码是这样的:

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

更新以回应评论这是错误的:

使用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中一样。

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

以下来自@EJP的评论表明关于echo服务的部分是错误的,错误的错误:

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

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

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