在Android中Ping应用程序

时间:2013-01-29 06:11:49

标签: android ping

我正在创建一个应用程序,它将实现“ping”命令的一些功能。问题是,我不知道在ANDROID中使用哪些库/库。 有人有任何想法吗?

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

3 个答案:

答案 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中详细讨论的那样,例如, herehere

我到达的解决方案是使用本机代码创建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)保护套接字文件描述符。

LWN article

中所述,有几点需要注意
  • 请记住通过读取(并可能设置)" / proc / sys / net / ipv4 / ping_group_range"的内容来验证您的系统是否允许ICMP套接字。
  • 内核修改"标识符"如果您打算将回复数据包转发给原始请求者,则必须重置ICMP标头中的字段(并重新计算校验和)。

答案 2 :(得分:0)

我在纯Android Java中实现了“ ping”并将其托管在gitlab上。它具有几个有用的功能,例如能够绑定到给定的网络。

https://github.com/dburckh/AndroidPing