AndroidアプリケーションからTCPDumpを使用する際に問題が発生しました。tcpdumpからの出力を1行ずつ読み取り、アプリケーション内で処理することになっています。
問題は次
のとおりです。コードが正常に機能する場合があり、キャプチャされたパケットをすぐに読み取ります。しかし、Linuxコンソールからtcpdumpプロセスを強制終了するまでReadLineがブロックされることがあります(killalltcpdump)。それを行った後、私のループは各行(場合によっては10、場合によっては1または2)に対して処理されます。つまり、readLineは機能するはずでしたが、機能しませんでした。
私は同様の問題について読みましたが、この問題の解決策は見つかりませんでした...
ありがとう!!
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);
}
}
}
}
}