2010-09-08 76 views
0

我在我的android模擬器上運行tcpdump,並且由於tcpdump在後臺運行,因此緩衝區中沒有任何數據,因此應用程序停留在此位置。 這裏是代碼的一部分:輸出緩衝區爲空,直到tcpdump被殺死

else if (tcpdumpButton.isChecked()) 
      { 
       try 
       { 
       Process process1 = Runtime.getRuntime().exec("tcpdump"); 
       DataOutputStream os = new DataOutputStream(process1.getOutputStream()); 
       BufferedReader osRes = new BufferedReader(new InputStreamReader(process1.getInputStream())); 
       //ByteArrayInputStream osRes = (ByteArrayInputStream) process1.getInputStream(); 
       // os.writeBytes("tcpdump -l port 80"); 
       os.flush(); 
       StringBuffer output = new StringBuffer(); 
       try 
       { 
        while ((osRes.readLine()) != null) 
        { 
         output.append(osRes.readLine()); 
         output.append("\n"); 
        } 
       } 
       catch (Exception e) 
       { 
        throw e; 
       } 
       process1.waitFor(); 
       tv.setText(output); 
       setContentView(tv); 
       } 
       catch (Exception e) 
       { 
       throw e; 
       } 

任何幫助嗎?

+0

您正在開始'tcpdump'子進程。什麼使它終止? – erickson 2010-09-08 06:51:54

+0

我不希望它終止,因爲我想捕獲所有的數據包 – Jony 2010-09-08 06:57:13

回答

1

您的代碼邏輯不好,因爲「BufferedInputStream.readLine()」是一種阻塞方法。

因此,在你的代碼中,你永遠不會退出while循環。 所以,你永遠不會到達「tv.setText(output);」

從流程中讀取一行後,如果您不想關閉流或關閉進程,您應該在while循環內打印緩衝區(並清理它)