5

我正在使用 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));
  }
}

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

4

2 回答 2

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

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

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

于 2010-05-05T22:57:03.523 回答
1

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

于 2010-05-06T06:22:37.097 回答