我的Android應用程序使用TCPDump時出現問題。 它應該從tcpdump逐行讀取輸出並在我的應用程序中處理它。
問題是:
有時代碼工作正常,它立即讀取捕獲的數據包。但有時,ReadLine會阻塞,直到我從Linux控制檯(killall tcpdump)中終止tcpdump進程。這樣做後,我的循環是處理每一行(有時10,有時1或2) - 這意味着,readLine應該工作,但沒有。
我讀了類似的問題,但沒有找到任何解決方案,這個問題...
謝謝!TCPDump-Buffer上的ReadLine有時會阻塞直到kill tcpdump
public class ListenActivity extends Activity {
static ArrayList<Packet> packetBuffer = new ArrayList<Packet>();
static Process tcpDumpProcess = null;
static ListenThread thread = null;
public static final String TCPDUMP_COMMAND = "tcpdump -A -s0 | grep -i -e 'Cookie'\n";
private InputStream inputStream = null;
private OutputStream outputStream = null;
@Override
protected void onStart() {
super.onStart();
try {
tcpDumpProcess = new ProcessBuilder().command("su").redirectErrorStream(true).start();
inputStream = tcpDumpProcess.getInputStream();
outputStream = tcpDumpProcess.getOutputStream();
outputStream.write(TCPDUMP_COMMAND.getBytes("ASCII"));
} catch (Exception e) {
Log.e("FSE", "", e);
}
thread = new ListenThread(new BufferedReader(new InputStreamReader(inputStream)));
thread.start();
}
private class ListenThread extends Thread {
public ListenThread(BufferedReader reader) {
this.reader = reader;
}
private BufferedReader reader = null;
@Override
public void run() {
reader = new BufferedReader(new InputStreamReader(inputStream));
while (true) {
try {
String received = reader.readLine();
Log.d("FS", received);
Packet pReceived = Packet.analyze(received);
if (pReceived != null) {
packetBuffer.add(pReceived);
}
} catch (Exception e) {
Log.e("FSE", "", e);
}
}
}
}
}
你有沒有直接使用[jnetpcap](http://jnetpcap.com/)的原因?讀取另一個進程的輸出結果似乎要解決您的問題還有很長的路要走。 – sarnold 2011-04-19 10:21:11
說實話,我並不瞭解jnetpcap :-)這看起來像我需要的東西......我正在深入研究它,並嘗試查明它是否已成功編譯爲Android-ARM。謝謝!! – andreas911 2011-04-19 12:46:08