11 Stimmen

Problem mit isReachable in der Klasse InetAddress

Als Aufgabe muss ich alle lebenden Computer in einem LAN finden. Dazu verwende ich isReachable Funktion von InetAddress Klasse. Aber das Problem ist, dass mir nichts angezeigt wird, was ich erreichen könnte. Also habe ich versucht, die isReachable mit der IP von Google, aber diese ist immer noch unerreichbar.

Hier ist der Code:

import java.net.*;

public class alive{
    public static void main(String args[]){
        try{
            InetAddress ia = InetAddress.getByAddress(new byte[]{(byte)209, (byte)85, (byte)153, (byte)104});
            boolean b = ia.isReachable(10000);
            if(b){
                System.out.println("Reachable");
            }
            else{
                System.out.println("Unrachable");
            }

        }catch(Exception e){
            System.out.println("Exception: " + e.getMessage());
        }
    }
}

Ausgang ist : Unreachable

6voto

Aravind Yarram Punkte 76365

Hier sind einige Details, warum isReachable() nicht immer wie erwartet funktioniert

  1. http://bordet.blogspot.com/2006/07/icmp-and-inetaddressisreachable.html
  2. http://www.coderanch.com/t/206934/sockets/java/InetAdress-isReachable-Ping-Permissions

Der richtige Weg für Sie ist die Verwendung der ICMP Protokoll. Das ist es, was ping verwendet, glaube ich. Hier ein Beispiel die Ihnen den Einstieg erleichtern.

4voto

Sourabh Bhat Punkte 1745

Hier ist der Code, der plattformunabhängig ist, aber Informationen über jeden offenen Port auf dem anderen Rechner benötigt (die wir meistens haben).

private static boolean isReachable(String addr, int openPort, int timeOutMillis) {
    // Any Open port on other machine
    // openPort =  22 - ssh, 80 or 443 - webserver, 25 - mailserver etc.
    try {
        try (Socket soc = new Socket()) {
            soc.connect(new InetSocketAddress(addr, openPort), timeOutMillis);
        }
        return true;
    } catch (IOException ex) {
        return false;
    }
}

3voto

Yevhen Surovskyi Punkte 857

Ich habe eine interessante Lösung gefunden. Wenn Sie Ihre Anwendung nicht als Root ausführen können, können Sie die Raw-Socket-Fähigkeit in Java einstellen:

sudo setcap cap_net_raw=ep /usr/lib/jvm/jdk/bin/java

Dann wird das ICMP-Protokoll anstelle der Echoanforderung auf dem TCP-Port 7 verwendet.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X