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.我想我一定是做错了,但谷歌的研究告诉我的不同之处.我很困惑!
更新以回应评论,这是错误的:
使用 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)等数据包嗅探器来确认线路上到底发生了什么。
| 归档时间: |
|
| 查看次数: |
5695 次 |
| 最近记录: |