我正在开发两个移动应用程序(Android和iOS),我必须发现网络中的所有主机。
我已经实现了一个ping某个范围内所有IP地址的功能,例如,如果我的IP地址是192.168.1.3,我扫描这个范围192.168.1.1 / 192.168.1.255。
该功能可以解析一些主持人但不是全部,我不明白原因,我用过" Fing"用于比较我的结果的应用程序,在这种情况下,我的功能发现了18/20主机但是43主机(全部)。
另一个问题是计算时间,我使用线程但ping解决方案浪费了更多时间来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);
}
}
};
}
答案 0 :(得分:1)
当fing正在扫描我的家庭网络时,我运行了数据包捕获(如下所示),似乎它不使用ping而是使用arp请求。它按顺序扫描所有IP,因此您可能只需调整代码即可使用arp请求。
(192.168.1.167是我手机上的IP)。
sudo tcpdump -ni eth0 host 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,并在以下网站上确认:https://www.wireshark.org/tools/oui-lookup.html。应用程序似乎执行其他请求和查找,但我相信这里解释了基本知识。