android 子网,Android子网扫描

本文介绍了一种改进的网络扫描方法,通过使用Java的InetAddress.isReachable()避免在Android设备上执行ping命令导致的问题。作者分享了从使用ping命令转为多线程池执行,提高扫描效率并降低故障风险的解决方案。
摘要由CSDN通过智能技术生成

在我的应用程序中,我需要扫描本地子网(192.168.1.*)以收集所有连接设备的MAC地址列表.

我目前使用以下策略:

>使用Runtime.exec同时启动255个ping命令(“ping -c 1< addr>”)

>对每个返回的进程使用waitFor()来收集退出代码

>关闭进程的输入流并销毁它们

>读取/ proc / net / arp文件并解析MAC地址

在大多数情况下,这非常有效,并提供快速扫描.

但是在某些设备上(例如android 1.5,有时在> = 4.0),执行会在创建进程时陷入困境(在几次成功启动之后),并且没有办法杀死正在运行的线程.

你看到我可以尝试解决这个问题吗?还是其他任何不会花太长时间的策略?

解决方法:

这可以通过使用运行INetAddress.isReachable()方法的线程池来解决(而不是在本机进程中运行ping命令).

private static final int NB_THREADS = 10;

public void doScan() {

Log.i(LOG_TAG, "Start scanning");

ExecutorService executor = Executors.newFixedThreadPool(NB_THREADS);

for(int dest=0; dest<255; dest++) {

String host = "192.168.1." + dest;

executor.execute(pingRunnable(host));

}

Log.i(LOG_TAG, "Waiting for executor to terminate...");

executor.shutdown();

try { executor.awaitTermination(60*1000, TimeUnit.MILLISECONDS); } catch (InterruptedException ignored) { }

Log.i(LOG_TAG, "Scan finished");

}

private Runnable pingRunnable(final String host) {

return new Runnable() {

public void run() {

Log.d(LOG_TAG, "Pinging " + host + "...");

try {

InetAddress inet = InetAddress.getByName(host);

boolean reachable = inet.isReachable(1000);

Log.d(LOG_TAG, "=> Result: " + (reachable ? "reachable" : "not reachable"));

} catch (UnknownHostException e) {

Log.e(LOG_TAG, "Not found", e);

} catch (IOException e) {

Log.e(LOG_TAG, "IO Error", e);

}

}

};

}

标签:android,process,ping,subnet,network-scan

来源: https://codeday.me/bug/20190609/1207779.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值