Android ICMP пинг - PullRequest
       18

Android ICMP пинг

5 голосов
/ 30 января 2012

Есть ли способ проверить связь с хостом (стандартный Android или через реализацию NDK) и получить подробную информацию об ответе?(время, ttl, потерянные пакеты и т. д.) Я думал о каком-то приложении с открытым исходным кодом, которое имеет эту функцию, но не может найти ...

Спасибо

Ответы [ 2 ]

13 голосов
/ 30 января 2012

Afaik, для отправки ICMP ECHO-запросов требуется root (то есть приложение, для которого это необходимо, должно быть setuid) - и это not в настоящее время возможно в "стоковом" Android (черт, даже метод InetAddress # isReachable () в Android - это шутка , которая не работает в соответствии со спецификацией).

Очень простой пример использования / usr / bin / ping & Process - чтение результатов пинга с использованием AsyncTask:

public class PingActivity extends Activity {
    PingTask mTask;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }

    @Override
    protected void onResume() {
        super.onResume();
        mTask = new PingTask();
        // Ping the host "android.com"
        mTask.execute("android.com");
    }

    @Override
    protected void onPause() {
        super.onPause();
        mTask.stop();
    }

    class PingTask extends AsyncTask<String, Void, Void> {
        PipedOutputStream mPOut;
        PipedInputStream mPIn;
        LineNumberReader mReader;
        Process mProcess;
        TextView mText = (TextView) findViewById(R.id.text);
        @Override
        protected void onPreExecute() {
            mPOut = new PipedOutputStream();
            try {
                mPIn = new PipedInputStream(mPOut);
                mReader = new LineNumberReader(new InputStreamReader(mPIn));
            } catch (IOException e) {
                cancel(true);
            }

        }

        public void stop() {
            Process p = mProcess;
            if (p != null) {
                p.destroy();
            }
            cancel(true);
        }

        @Override
        protected Void doInBackground(String... params) {
            try {
                mProcess = new ProcessBuilder()
                    .command("/system/bin/ping", params[0])
                    .redirectErrorStream(true)
                    .start();

                try {
                    InputStream in = mProcess.getInputStream();
                    OutputStream out = mProcess.getOutputStream();
                    byte[] buffer = new byte[1024];
                    int count;

                    // in -> buffer -> mPOut -> mReader -> 1 line of ping information to parse
                    while ((count = in.read(buffer)) != -1) {
                        mPOut.write(buffer, 0, count);
                        publishProgress();
                    }
                    out.close();
                    in.close();
                    mPOut.close();
                    mPIn.close();
                } finally {
                    mProcess.destroy();
                    mProcess = null;
                }
            } catch (IOException e) {
            }
            return null;
        }
        @Override
        protected void onProgressUpdate(Void... values) {
            try {
                // Is a line ready to read from the "ping" command?
                while (mReader.ready()) {
                    // This just displays the output, you should typically parse it I guess.
                    mText.setText(mReader.readLine());
                }
            } catch (IOException t) {
            }
        }
    }
}
0 голосов
/ 11 марта 2012

Я нашел способ выполнить команду ping без рута.
Сначала запускает процесс 'sh', а затем выполняет 'ping' в этой оболочке, код:

p = new ProcessBuilder("sh").redirectErrorStream(true).start();

DataOutputStream os = new DataOutputStream(p.getOutputStream());
os.writeBytes("ping -c 10 " + host + '\n');
os.flush();

// Close the terminal
os.writeBytes("exit\n");
os.flush();

// read ping replys
BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line;

while ((line = reader.readLine()) != null) {
    System.out.println(line);
}

Отлично работает на моем устройстве HTC с CyanogenMod 7.1.0 (Android 2.3.7)

...