在Android中Ping应用程序
我正在做一个应用程序,将执行“ping”命令的一些function。问题是,我不知道在ANDROID中使用哪个库/库。 任何人有任何想法吗?
我已经访问过这些计算器链接,但他们不是很有帮助。
- 有没有办法使android设备回答广播地址的icmp坪?
- https://stackoverflow.com/questions/5601513/problem-to-do-ping-with-android
- AndroiddebuggingInetAddress.isReachable
- 如何icmp平安在Android上
- 如何从Java Android平台的外部IP
我用下面的代码来ping。
public String ping(String url) { String str = ""; try { Process process = Runtime.getRuntime().exec( "/system/bin/ping -c 8 " + url); BufferedReader reader = new BufferedReader(new InputStreamReader( process.getInputStream())); int i; char[] buffer = new char[4096]; StringBuffer output = new StringBuffer(); while ((i = reader.read(buffer)) > 0) output.append(buffer, 0, i); reader.close(); // body.append(output.toString()+"\n"); str = output.toString(); // Log.d(TAG, str); } catch (IOException e) { // body.append("Error\n"); e.printStackTrace(); } return str; }
在这个url中,你需要传递你想要ping的地址。
感谢您研究这个问题。 您连接到的问题(以及其他许多问题)都会导致使用系统的ping可执行文件或尝试可疑的InetAddress.isReachable方法的解决scheme。 然而,还有第三种select – 如果你愿意添加一些本地代码 。
我最近为Android VPN应用程序实现了ICMP Echo(ping)function。 我无法使用系统“ping”可执行文件,因为它发送的ICMP数据包被我的VPN所捕获,无论如何,我希望能够将ICMP数据包从我的networking转发到外部世界并接收回复。
InetAddress.isReachable方法根本不适用于我(总是返回false),正如SO中已经详细讨论过的,例如在这里和这里 。
我得到的解决scheme是使用本地代码来创build一个ICMP套接字,我用它来发送和接收ICMP数据包 (Echo请求和回应“ ping ”)。 Linux内核支持(自2011年以来)创build没有任何特殊权限的ICMP套接字 。 使用协议PROT_ICMP创build一个新的ICMP套接字作为数据报套接字。 C中的一个很好的实现例子可以在这个答案中看到。
ICMP套接字function已经移植到Android ,甚至在“ping”程序中使用 。 实际上有人提出它可以用来修复InetAddress.isReachable()的实现 。
Java API不支持这种function,但使用本地代码可以打开ICMP套接字。 我使用JNA来访问我需要的libC函数(socket(),close(),sendto(),recvfrom(),poll()等)。 我想JNI也可以工作。
为了避开VPN限制,套接字文件描述符需要使用VpnService.protect(int)进行保护。
有几个警告,正如LWN文章中所解释的:
- 请记住通过读取(并可能设置)“/ proc / sys / net / ipv4 / ping_group_range”的内容来validation您的系统是否允许使用ICMP套接字。
- 内核修改ICMP头部中的“标识符”字段,如果打算将回复数据包转发给原始请求者,则必须重置该字段(并重新计算校验和)。