2012-01-30 10 views
5

क्या मेजबान (मानक एंड्रॉइड या एनडीके कार्यान्वयन के माध्यम से) पिंग करने का कोई तरीका है, और प्रतिक्रिया पर विस्तृत जानकारी प्राप्त करें? (समय, टीटीएल, संकुल, खो आदि ..) मैं इस सुविधा है, लेकिन किसी भी नहीं मिल सकता है कि कुछ खुला स्रोत अनुप्रयोग के बारे में सोच रहा था ...एंड्रॉइड आईसीएमपी पिंग

धन्यवाद

उत्तर

13

AFAIK, भेजने ICMP ECHO का अनुरोध करता है की जरूरत है रूट (यानी ऐप जिसे इसे सेट्यूड करने की आवश्यकता है) - और वर्तमान में "स्टॉक" एंड्रॉइड में नहीं है (नरक, यहां तक ​​कि InetAddress#isReachable() एंड्रॉइड में विधि joke है जो spec के अनुसार काम नहीं करती है)।

एक बहुत ही बुनियादी उदाहरण का उपयोग/usr/bin/पिंग & प्रक्रिया - पिंग परिणाम पढ़ने, एक 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

नहीं। मेरे पास अनियंत्रित फोन है, नेट पिंग ऐप डिज़ाइन के रूप में काम कर रहा है। –

+1

तो यह शायद [java.lang.Process] (http://developer.android.com/reference/java/lang/Process.html) का उपयोग कर पिंग कमांड निष्पादित कर रहा है - वह आदेश सेट्यूड है और यदि आप टीटीएल दे सकते हैं आउटपुट को पार्स करें - इसे सीधे जावा से करना काम नहीं करेगा (प्रक्रिया में उदाहरण वास्तव में पिंग कमांड चला रहा है)। – Jens

+0

क्या आप रूट के बिना java.lang.Process के साथ 'पिंग' कमांड निष्पादित कर सकते हैं? –

0

मैं जड़ के बिना पिंग कमांड निष्पादित करने के लिए एक रास्ता मिल गया।
पहले एक 'श' प्रक्रिया Spawns, और फिर उस खोल में 'पिंग' पर अमल, कोड:

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); 
} 

यह CyanogenMod 7.1.0 (एंड्रॉयड 2.3.7)

के साथ अपने HTC डिवाइस पर ठीक काम करता है
+1

बिना पिंग कमांड पर <# seconds> बिना मुझे असंगत होने पर एक लटका मिलता है - यह कोशिश करने वालों के लिए बस एक चेतावनी .. –

+1

-1 यह एक खोल बनाने के लिए एक खराब डिजाइन है, फिर पिंग लॉन्च करें। इसमें अधिक पार्सिंग और इनपुट में गुजरने में अधिक कठिनाई शामिल है। सीधे पिंग लॉन्च करना बेहतर है। –

संबंधित मुद्दे