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