1. Nimm jetzt an unserem 2. ADVENT-Gewinnspiel teil - Alle Informationen findest Du hier!

Ping address

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von v Ralle v, 13.08.2011.

  1. v Ralle v, 13.08.2011 #1
    v Ralle v

    v Ralle v Threadstarter Android-Lexikon

    Beiträge:
    913
    Erhaltene Danke:
    199
    Registriert seit:
    27.08.2010
    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
     

Diese Seite empfehlen