3

我想检查是否存在活动的互联网连接。为此,我发现我可以使用 InetAddress 类中的 isReachable() 方法来做到这一点。不幸的是(正如JavaDoc所建议的和这篇文章所证实的那样),这仅适用于 root 权限,这无法解决我的问题。

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

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

因此,我正在寻找一个很好的替代方法来检查活动的 Internet 连接,而无需 root 权限。

谢谢!

4

4 回答 4

2

你知道ICMP协议吗?我相信这就是 ping 在内部使用的。看看这个例子。(尽管这是 Windows 的解决方案)

另外阅读这篇文章以获得关于这个主题的高级讨论!

于 2012-10-21T10:03:16.977 回答
0

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

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

于 2012-10-21T22:28:50.660 回答
0

它可能很旧,但我遇到了同样的问题,在阅读了这些答案后,我发现了这个惊人的库icmp 4j并解决了我所有的问题。您可以在此处下载源代码并在您的项目中使用类似这样的东西

// 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);
}
于 2015-05-07T18:24:07.710 回答
0

InetAddress.isReachable() - 无需root!

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

您按以下方式执行此操作;(以root身份运行)

setcap cap_net_raw+eip $JAVA_HOME/bin/java

你有它......你的java应用程序可以ping而不是root!


如果您收到以下错误;

./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是行不通的。

于 2018-10-09T04:22:40.290 回答