我正在创建一个应用程序,它将实现“ping”命令的一些功能。问题是,我不知道在ANDROID中使用哪些库/库。 有人有任何想法吗?
我访问了这些stackoverflow链接,但它们并没有太大帮助。
答案 0 :(得分:19)
我使用以下代码来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;
}
在网址中,您需要传递要ping的地址。
答案 1 :(得分:9)
感谢您研究此问题。您链接到的问题(以及SO上的许多其他问题)都会导致使用系统的ping可执行文件或尝试使用可疑InetAddress.isReachable方法的解决方案。 然而,还有第三种选择 - 如果您愿意添加一些原生代码。
我最近为Android VPN应用程序实现了ICMP Echo(ping)功能。我无法使用系统" ping"可执行的,因为它发送的ICMP数据包被我的VPN捕获,无论如何,我希望能够将ICMP数据包从我的网络转发到外部世界并收到回复。
InetAddress.isReachable方法对我来说根本不起作用(总是返回false),正如在SO中详细讨论的那样,例如, here和here。
我到达的解决方案是使用本机代码创建ICMP套接字,我曾经发送和接收ICMP packets(Echo请求和回复" ping") 。 Linux内核支持(自2011年起)ICMP sockets without any special privileges的创建。使用协议PROT_ICMP创建新的ICMP套接字作为数据报套接字。在this answer中可以看到C中的一个很好的实现示例。
ICMP套接字功能也是ported to Android,甚至在"ping" program中使用。事实上,有人建议它可以用于fix the implementation of InetAddress.isReachable()。
Java API不支持此功能,但使用本机代码可以打开ICMP套接字。我使用JNA来访问我需要的libC函数(socket(),close(),sendto(),recvfrom(),poll()等)。我想JNI也会起作用。
要解决VPN限制,需要使用VpnService.protect(int)保护套接字文件描述符。
中所述,有几点需要注意答案 2 :(得分:0)
我在纯Android Java中实现了“ ping”并将其托管在gitlab上。它具有几个有用的功能,例如能够绑定到给定的网络。