InetAddress类中isReachable的替代方法

时间:2012-10-21 09:12:01

标签: java networking icmp

我想检查是否存在活动的互联网连接。为此我found out我可以使用InetAddress类中的isReachable()方法。不幸的是(正如JavaDoc建议和此帖verifies),这只适用于root权限,什么都不能解决我的问题。

当我运行以下代码时,isReachable始终为false:

InetAddress address = InetAddress.getByName("173.194.35.3"); //e.g. google
boolean isReachable = address.isReachable(2000); //ms

因此,我正在寻找一个很好的选择,以检查有效的互联网连接,而无需root权限。

谢谢!

4 个答案:

答案 0 :(得分:2)

你知道ICMP协议吗?这就是我认为ping在内部使用的内容。查看this example。 (Allbeit这是Windows的解决方案)

另请阅读此post以进行有关此主题的高级别讨论!

答案 1 :(得分:0)

Javadoc根本没有说,你链接的帖子也没有“验证”它。 实际上所说的是“如果可以获得特权,典型的实现将使用ICMP ECHO REQUEST,否则它将尝试在目标主机的端口7(Echo)上建立TCP连接。”

换句话说,您根本不需要特权来调用此方法。您只需要用于ICMP模式的权限。如果您没有它们(或者您在Windows上,因为没有使用ICMP实现),它使用TCP到端口7.并注意它处理连接成功或连接拒绝为“可达”。

答案 2 :(得分:0)

它可能很旧,但我遇到了同样的问题,在阅读完这些答案后,我找到了这个神奇的图书馆icmp 4j并解决了我所有的问题。您可以下载源代码here并在项目中使用类似

的内容
// request
final IcmpPingRequest request = IcmpPingUtil.createIcmpPingRequest ();
request.setHost ("192.168.0.101");

// repeat a few times
for (int count = 1; count <= 4; count ++) {

// delegate
final IcmpPingResponse response = IcmpPingUtil.executePingRequest (request);

// log
final String formattedResponse = IcmpPingUtil.formatResponse (response);
System.out.println (formattedResponse);

// rest
Thread.sleep (1000);
}

答案 3 :(得分:0)

InetAddress.isReachable()-无需运行root就可以运行!

您只需要为java可执行文件分配发送ICMP数据包/等的功能。

您可以执行以下操作; (以root身份运行)

  

setcap cap_net_raw + eip $ JAVA_HOME / bin / java

就在那里...您的Java应用程序可以在没有root用户的情况下ping通!


如果出现以下错误;

  

./ java:加载共享库时出错:libjli.so:无法打开共享对象文件:没有这样的文件或目录

您可以使用以下方法解决此问题: (需要以root用户身份进行,请确认/usr/lib64对您来说是正确的)

  

ln -s $ JAVA_HOME / lib / amd64 / jli / libjli.so /usr/lib64/libjli.so

请注意:不幸的是,仅执行export LD_LIBRARY_PATH=$JAVA_HOME/lib/amd64/jli无效。