Ping在Android中的应用

Ping在Android中的应用,android,ping,Android,Ping,我正在制作一个应用程序,它将实现“ping”命令的一些功能。问题是,我不知道在ANDROID中使用哪个库。 有人知道吗 我已经访问了这些stackoverflow链接,但它们没有太大帮助 我使用了以下代码来ping public String ping(String url) { String str = ""; try { Process process = Runtime.getRuntime().exec( "/s

我正在制作一个应用程序,它将实现“ping”命令的一些功能。问题是,我不知道在ANDROID中使用哪个库。 有人知道吗

我已经访问了这些stackoverflow链接,但它们没有太大帮助


我使用了以下代码来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可执行文件或尝试可疑方法的解决方案但是,还有第三种选择——如果您愿意添加一些本机代码

我最近为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报头中的“标识符”字段,如果要将应答包转发给原始请求者,则必须重置它(并重新计算校验和)
我在纯Android Java中实现了“ping”,并将其托管在gitlab上。它有一些有用的特性,比如能够绑定到给定的网络


您给出的链接到底有什么问题?你尝试过什么?你需要什么样的ping功能?往返时间延迟,丢包计算。非常有用。。。。我一半的工作都做完了。。。仍然无法理解如何格式化输出?你对此有什么建议吗?@mihir6692:)很乐意帮忙。你知道如何格式化输出吗?这会更有帮助。。。提前谢谢。。。。我不知道该使用哪个库你说的输出格式是什么意思?你到底想用它做什么。在输出中,它全部打印在一起,我想这样打印(新行中的所有内容):[ipaddress][packet sequence no][ttl][rtt]如何使用基于java的VpnService.protect()方法保护在本机代码中创建的套接字,例如,您是否必须将fd从本机代码返回到java中,然后用它调用protect()?另外,如果ping_group_range显示为“0 2147483647”,这是否意味着它对所有人都启用?我自己回答:是的,只需从本机代码返回fd并将int直接传递到VpnService.protect()。保护后,现在可以接收ICMP响应。