Android 如何扫描和发现网络中的所有主机

Android 如何扫描和发现网络中的所有主机,android,networking,Android,Networking,我正在开发两个移动应用程序(Android和iOS),我必须发现网络中的所有主机 我实现了一个函数,可以ping某个范围内的所有IP地址,例如,如果我的IP地址是192.168.1.3,我会扫描这个范围192.168.1.1/192.168.1.255 函数discover有些主机,但不是全部,我不明白原因,我使用“Fing”应用程序比较我的结果,在这种情况下,我的函数发现18/20个主机,但Fing 43个主机(全部) 另一个问题是计算时间,我使用线程,但ping解决方案浪费更多的时间来“pi

我正在开发两个移动应用程序(Android和iOS),我必须发现网络中的所有主机

我实现了一个函数,可以ping某个范围内的所有IP地址,例如,如果我的IP地址是192.168.1.3,我会扫描这个范围192.168.1.1/192.168.1.255

函数discover有些主机,但不是全部,我不明白原因,我使用“Fing”应用程序比较我的结果,在这种情况下,我的函数发现18/20个主机,但Fing 43个主机(全部)

另一个问题是计算时间,我使用线程,但ping解决方案浪费更多的时间来“ping”所有地址

如何发现网络中的所有主机

有人能给我解释一下原因吗,因为我不能发现所有的主机都像fing一样

我使用的源代码:

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);
            }
        }
    };
}
private static final int NB_THREADS=10;
公共空间{
Log.i(Log_标签,“开始扫描”);
ExecutorService executor=Executors.newFixedThreadPool(NB_线程);
对于(int dest=0;dest我在fing扫描我的家庭网络时运行了一个数据包捕获(如下所示),它似乎不使用ping,而是使用arp请求。它按顺序扫描所有IP,所以也许您只需要调整代码以使用arp请求

(192.168.1.167是我手机的IP地址)

sudo tcpdump-ni eth0主机192.168.1.167

tcpdump:抑制详细输出,使用-v或-vv进行完整协议解码 在eth0上侦听,链路类型为EN10MB(以太网),捕获大小为65535字节

01:18:32.695316 ARP,请求谁拥有192.168.1.2告诉192.168.1.167,长度46 01:18:32.715596 ARP,请求谁拥有192.168.1.4告诉192.168.1.167,长度46 01:18:32.725965 ARP,请求谁拥有192.168.1.5告诉192.168.1.167,长度46 01:18:32.736293 ARP,请求谁拥有192.168.1.6告诉192.168.1.167,长度46 01:18:32.746567 ARP,请求谁拥有192.168.1.7告诉192.168.1.167,长度46 01:18:32.761394 ARP,请求谁拥有192.168.1.8告诉192.168.1.167,长度46 01:18:32.769972 ARP,请求谁拥有192.168.1.9告诉192.168.1.167,长度46 01:18:32.777456 ARP,请求谁拥有192.168.1.10告诉192.168.1.167,长度46


更新:我忘了提到fing也运行mac查找,你可以通过fing获得列出的任何mac,并在以下网站上确认:。该应用程序似乎执行其他请求和查找,但我相信这里解释了基本操作。

没有简单的方法可以做到这一点。如果你希望实现这种功能,你应该看看.