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

Ray*_*yne 5 java ping clojure inetaddress

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

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

(.isReachable (java.net.InetAddress/getByName "www.microsoft.com") 5000)
Run Code Online (Sandbox Code Playgroud)

我的一位好朋友翻译成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));
  }
}
Run Code Online (Sandbox Code Playgroud)

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

Ber*_*t F 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 身份运行的,而且因为目标地址不太可能有 root 权限。 echo 服务启动并运行。太糟糕了。

@EJP 下面的评论指出关于 echo 服务的部分是错误的,错误错误:

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

在此类情况下,我使用 WireShark、tcpdump(Windows 上的 WinDump)或 snoop(Solaris)等数据包嗅探器来确认线路上到底发生了什么。

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