Android ICMP ping

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

благодаря

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

Очень простой пример использования / usr / bin / ping & Process – чтение результатов ping с использованием 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) { } } } } 

Я нашел способ выполнить команду ping без root.
Сначала запускает процесс «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)

Intereting Posts
Использование JRuby для прямого вызова методов Java Java Извлечение # спутников, используемых в gps fix от Android Adobe AIR / FlashBuilder 4.6: создание напоминания в приложении для Android Как удалить или изменить событие из G-календаря из моего приложения для Android? Как отображать всплывающее окно при наведении наложения в Android? Unmarshalling коды типов и значение смещения и их значение? Как выделить выбранный элемент просмотра ресайклеров? Постоянно скрывать панель навигации в действии Обнаруживать нажмите на RecyclerView за пределами элементов Статический класс «Поля» в google analytics v3 ReplaceAll не заменяет строку Android: использование AUTO-CANCEL при уведомлении, когда ваше приложение работает в фоновом режиме Андроидный залп JsonObjectRequest, который не возвращает ни одного тела всего 200 Я хочу ссылаться на не конечную переменную внутри внутреннего класса, определенного другим способом Решение для доступа к глобальным данным повсюду – эффективно