Android子网扫描

Android子网扫描,android,process,ping,subnet,network-scan,Android,Process,Ping,Subnet,Network Scan,在我的应用程序中,我需要扫描本地子网(192.168.1.*)以收集所有连接设备的MAC地址列表 我目前使用以下策略: 使用Runtime.exec(“ping-c1”) 在每个返回的进程上使用waitFor(),以收集退出代码 关闭进程的输入流并销毁它们 读取/proc/net/arp文件并解析MAC地址 在大多数情况下,这工作得很好,并提供了快速扫描 但是在一些设备上(比如android 1.5,有时在>=4.0上),执行会在进程创建时停滞(在一些进程成功启动之后),无法终止正在运行的线程

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

我目前使用以下策略:

  • 使用
    Runtime.exec(“ping-c1”)
  • 在每个返回的进程上使用
    waitFor()
    ,以收集退出代码
  • 关闭进程的输入流并销毁它们
  • 读取
    /proc/net/arp
    文件并解析MAC地址
  • 在大多数情况下,这工作得很好,并提供了快速扫描

    但是在一些设备上(比如android 1.5,有时在>=4.0上),执行会在进程创建时停滞(在一些进程成功启动之后),无法终止正在运行的线程


    你觉得我能解决这个问题吗?或者任何其他不会花费太长时间的策略?

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

    private static final int NB_THREADS=10;
    公共空间{
    Log.i(Log_标签,“开始扫描”);
    ExecutorService executor=Executors.newFixedThreadPool(NB_线程);
    
    对于(int dest=0;destyou是我的heroHi。我可以问一个问题吗?运行代码后,我发现有时isReachable return false,即使我的地址还活着->你能帮我解释一下吗?如果你想了解更多信息,我可以创建问题帖子
    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);
                }
            }
        };
    }