v Ralle v
Stammgast
- 202
Ich muss meinen Frust jetzt einfach mal loswerden, weil dafür doch 1-2h sinnlos drauf gegangen sind.
Ich schreibe im Moment an einem Netzwerkscanner für eine App. Den Scanner hatte ich vorher schon normal mit Java zum Testen implementiert und er lief wunderbar. Dabei rufe ich unter anderem folgende Methode auf:
Nun habe ich meinen Scanner auf Android portiert. Ich war etwas verwirrt, weil diese Methode nur bei meinem Router und dem Android Gerät selber true zurückgeliefert hat. Bei meinem PC und Laptop kam immer nur false. Die Beschreibung der Methode bei Android sagt:
Und die normale API von Oracle:
Da es für mich keinen Unterschied gab, habe ich alles mögliche probiert, um den Fehler zu finden. Danach habe ich einfach mal ein Socket zu einem Service von meinem PC aufgemacht und siehe da, das Socket konnte sich erfolgreich verbinden. Ich habe daraufhin weiter gegoogled und bei Stackoverflow kamen einige Meldungen, dass die isReachable(..) Methode bei Android mehr schlecht als recht funktioniert.
Für diese Info habe ich wirklich viel Zeit in den Sand gesetzt. Ich habe danach meine eigene Methode geschrieben, die funktioniert wunderbar. Wer sich dafür interessiert:
Kurz zur Erklärung: die erste eingelesene Zeile liefert nur die Info, dass jetzt ein Ping ausgeführt wird, daher kann man sie ignorieren. Die anderen beiden enden mit einer Zeit, zb. "1.89 ms", oder mit "Host not reachable". Das Szenario könnte man auf mehr Zeilen erweitern (oder die zweite auch wegnehmen).
Grüße
Ich schreibe im Moment an einem Netzwerkscanner für eine App. Den Scanner hatte ich vorher schon normal mit Java zum Testen implementiert und er lief wunderbar. Dabei rufe ich unter anderem folgende Methode auf:
Code:
InetAddress.getByName(myIP).isReachable(3000)
Code:
Tries to reach this InetAddress. This method first tries to use ICMP [I](ICMP ECHO REQUEST)[/I]. When first step fails, a TCP connection on port 7 (Echo) of the remote host is established.
Code:
Test whether that address is reachable. Best effort is made by the implementation to try to reach the host, but firewalls and server configuration may block requests resulting in a unreachable status while some specific ports may be accessible. A typical implementation will use ICMP ECHO REQUESTs if the privilege can be obtained, otherwise it will try to establish a TCP connection on port 7 (Echo) of the destination host.
Für diese Info habe ich wirklich viel Zeit in den Sand gesetzt. Ich habe danach meine eigene Methode geschrieben, die funktioniert wunderbar. Wer sich dafür interessiert:
Code:
private boolean isReachable(String ip) {
try {
Process exec = Runtime.getRuntime().exec("ping " + ip);
BufferedReader reader = new BufferedReader(new InputStreamReader(exec.getInputStream()));
reader.readLine();//PING...bytes of data.
String line1 = reader.readLine().trim();
String line2 = reader.readLine().trim();
exec.destroy();
return line1.endsWith("ms") && line2.endsWith("ms");
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
Grüße