【发布时间】:2017-01-24 19:27:03
【问题描述】:
我正在尝试通过 ping 每一台设备并检查“可达”值来检测连接到我当前所在网络的设备。下面是负责执行此操作的一段代码,循环访问 IP、ping 它们并检查响应:
for (int i = 1; i <= 254; i++) {
String addr = IPAddress;
addr = addr.substring(0, addr.lastIndexOf('.') + 1) + i;
InetAddress pingAddr = InetAddress.getByName(addr);
//skips the IP of 'this' device
if (pingAddr.getHostAddress().equals(IPAddress)) { continue; }
try {
//ping command
Process p1 = java.lang.Runtime.getRuntime().exec("ping -c 1 -w 1 " + addr);
boolean reachable = (p1.waitFor() == 0);
if (reachable) {
//add to list, if reachable
addrs.add(pingAddr);
}
} catch (IOException ex) {
} catch (InterruptedException ex) {
}
}
由于某种原因,这段代码只检测到一些设备。我有 3 台笔记本电脑、2 台安卓设备和 1 台 PC 进行测试。其中,它成功地检测到了 3 台笔记本电脑中的 2 台,都是 android 设备,但它未能检测到 PC。您可以注意到命令中的“-w 1”,我尝试将其设置为 100,唯一的变化是它需要很长时间才能完成,并且仍然找到相同的设备。
这个方法我也试过了:
INetAddress.isReachable(int timeout);
但情况变得更糟,因为 - 至少我发现 - 它使用 TCP 回显,并非所有设备都响应(只有我的 android 设备会响应)。
另外,ping 真的很慢。我已经把它分成了 4 个线程,但它仍然可以使用速度提升。
所以,我的最后一个问题是:为什么 ping 命令无法检测到所有设备?您还有其他方法可以实现我的目标吗?
【问题讨论】:
标签: java android networking ping