使用进程运行ping命令与shell有不同的结果

时间:2013-07-02 18:27:37

标签: android shell process command ping

我尝试在我的应用程序上实现PING命令。我这样做的方法是创建一个进程然后执行命令。 PING命令完成后,我从控制台解析结果。

该方法工作正常。我的问题是当我尝试更改PING命令的间隔时间值时。 PING可以将一个值作为参数,定义2个数据包发送之间的间隔。当我从我的应用程序执行该方法时,结果与使用终端仿真器执行的结果不同。

间隔值强调设备在更短的时间内发送更多数据包。我已将间隔值设置为0.1 ms并检查了两种情况的结果。该设备与终端仿真器配合使用,损失1-2%。使用我的应用程序,结果显示70-80%的损失。

对于1ms的间隔,结果是相同的。 (设备没有压力)

从我所做的不同测试中,我意识到在我的应用程序中调用PING方法时,设备会丢失很多数据包。

这怎么可能?我认为在进程中执行命令与从终端模拟器执行它会产生相同的结果。有什么想法吗?

我使用此处的代码Run shell commands from android program

我知道su不是必需的......

public void runAsRoot(String[] cmds) throws Exception {
        Process p = Runtime.getRuntime().exec("su");
        DataOutputStream os = new DataOutputStream(p.getOutputStream());
        InputStream is = p.getInputStream();
        for (String tmpCmd : cmds) {
            os.writeBytes(tmpCmd+"\n");
            int readed = 0;
            byte[] buff = new byte[4096];
            boolean cmdRequiresAnOutput = true;
            if (cmdRequiresAnOutput) {
                while( is.available() <= 0) {
                    try { Thread.sleep(5000); } catch(Exception ex) {}
                }

                while( is.available() > 0) {
                    readed = is.read(buff);
                    if ( readed <= 0 ) break;
                    String seg = new String(buff,0,readed);   
                    result=seg; //result is a string to show in textview
                }
            }
        }        
        os.writeBytes("exit\n");
        os.flush();

1 个答案:

答案 0 :(得分:0)

据我所知,从adb shell执行命令与让应用程序调用像Process p = Runtime.getRuntime().exec(" A COMMAND ");

这样的过程不同

这样的一个示例是dumpsys命令,如果您以programmaticaly方式执行它,则不会返回结果。 (你需要root或自定义内核)......

喜欢这个example

当我从adb和语法中调用ping -c 1000 -i 0.1 www.google.com时,必须发生类似的事情。