Ping在Android中的应用
我正在制作一个应用程序,它将实现“ping”命令的一些功能。问题是,我不知道在ANDROID中使用哪个库。 有人知道吗 我已经访问了这些stackoverflow链接,但它们没有太大帮助Ping在Android中的应用,android,ping,Android,Ping,我正在制作一个应用程序,它将实现“ping”命令的一些功能。问题是,我不知道在ANDROID中使用哪个库。 有人知道吗 我已经访问了这些stackoverflow链接,但它们没有太大帮助 我使用了以下代码来ping public String ping(String url) { String str = ""; try { Process process = Runtime.getRuntime().exec( "/s
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可执行文件或尝试可疑方法的解决方案但是,还有第三种选择——如果您愿意添加一些本机代码 我最近为Android VPN应用程序实现了ICMP Echo(ping)功能。我无法使用系统“ping”可执行文件,因为它发送的ICMP数据包被我的VPN捕获,无论如何,我希望能够将ICMP数据包从我的网络转发到外部世界并接收回复 InetAddress.isReachable方法根本不适用于我(始终返回false),如SO中所详细讨论的,例如和 我找到的解决方案是使用本机代码创建ICMP套接字,我使用该套接字发送和接收(针对“”的回显请求和回复)。Linux内核(自2011年起)支持创建。一个新的ICMP套接字被创建为具有协议PROT_ICMP的数据报套接字。中可以看到一个很好的C实现示例 ICMP套接字功能也已在中使用,甚至已在中使用。事实上,有人建议,它可以用来 Java API不支持此功能,但使用本机代码可以打开ICMP套接字。我曾经访问过我需要的libC函数(socket()、close()、sendto()、recvfrom()、poll()等等)。我想JNI也能工作 要绕过VPN限制,需要使用保护套接字文件描述符 有几个注意事项,如中所述:
- 请记住,通过读取“/proc/sys/net/ipv4/ping\u group\u range”的内容(并可能进行设置),验证您的系统是否允许ICMP套接字
- 内核修改ICMP报头中的“标识符”字段,如果要将应答包转发给原始请求者,则必须重置它(并重新计算校验和)
您给出的链接到底有什么问题?你尝试过什么?你需要什么样的ping功能?往返时间延迟,丢包计算。非常有用。。。。我一半的工作都做完了。。。仍然无法理解如何格式化输出?你对此有什么建议吗?@mihir6692:)很乐意帮忙。你知道如何格式化输出吗?这会更有帮助。。。提前谢谢。。。。我不知道该使用哪个库你说的输出格式是什么意思?你到底想用它做什么。在输出中,它全部打印在一起,我想这样打印(新行中的所有内容):[ipaddress][packet sequence no][ttl][rtt]如何使用基于java的VpnService.protect()方法保护在本机代码中创建的套接字,例如,您是否必须将fd从本机代码返回到java中,然后用它调用protect()?另外,如果ping_group_range显示为“0 2147483647”,这是否意味着它对所有人都启用?我自己回答:是的,只需从本机代码返回fd并将int直接传递到VpnService.protect()。保护后,现在可以接收ICMP响应。