Ping address

v Ralle v

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:

Code:
InetAddress.getByName(myIP).isReachable(3000)
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:

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.
Und die normale API von Oracle:

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.
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:


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

Ähnliche Themen

2
  • 2slow4you
Antworten
5
Aufrufe
680
2slow4you
2
A
  • audacity363
Antworten
2
Aufrufe
871
audacity363
A
F
Antworten
4
Aufrufe
673
keinbrain
keinbrain
Zurück
Oben Unten