Schnell alle lokale IPs finden

  • Hallo und so liebe Kollegen. ^^


    In einem lokaten Netzwerk (Intranet) können sich ja mehrere Geräte miteinander verbinden.
    Ich bräuchte jetzt eine Methode um die IPs aller Teilnehmer zu ermitteln. Da man den Router aber nicht dazu bringen kann dir die Liste zuzuschicken braucht man eine andere Lösung.
    Ich habe meine gefunden, in dem ich einfach die IP des Routers nehme und alle 254 dazugehörigen IPs durchsuche. Das dauert aber natürlich eine ganze Weile.


    Meine Frage:
    gibt es eine bessere Lösung?


    Danke schonmal

  • Also zunächst mal ist Deine Lösung nicht gut.


    Du hast eigentlich nie genau 254 zum Router gehörende IPs.
    Nehmen wir an es handle sich um 192.168.1.1 mit der Subnetzmaske 255.255.255.0
    Dann wäre 192.168.1.0 die Netzwerkadresse und keine gültige IP.
    Und die 192.168.1.255 wäre die Broadcastadresse und ebenfalls keine gültige IP.


    Lautet das Ganze aber 192.168.1.0/255.255.0.0, dann sieht das plötzlich ganz anders aus.
    192.168.0.0 wäre die Netzwerkadresse und 192.168.255.255 die Broadcast. Du hast also ungefähr (255*255)-2 mögliche Adressen – viel Spaß beim Warten.


    Schön ist auch das interne 10er Netzwerk.
    10.0.0.1 bei 255.0.0.0 macht 10.0.0.0 als Netzwerk- und 10.255.255.255 als Broadcast, also (255*255*255)-2 Adressen.


    Im Gegenzug dazu könnte es auch wie folgt aussehen:
    192.168.160.66/255.255.255.192
    Dann hätten wir 192.168.160.64 als Netzwerk- und 192.168.160.71 als Broadcast, Du kommst also keinesfalls an beispielsweise die 192.168.160.75 ran.


    Lange Rede gar kein Sinn.
    Entweder Du überprüfst Deine IP mit Deiner Subnetzmaske und ackerst dort alle für Dich erreichbaren IPs ab.
    (Mit Proxies, NAT und wasweißichwasnoch wird allerdings auch das eher ungenau)
    Auch da hast Du das Problem, dass jeder Ping ganz schön dauert, bis der Timeout passiert.


    Eine praktische Möglichkeit bietet da der Ping auf die Broadcast Adresse.
    (Wie eben angedeutet muss diese an Hand Deiner IP und Deiner Subnetzmaske berechnet werden.)


    Beispiel:


    Das lässt Du ein paar Sekunden laufen, parst die Rückgabewerte, fügst immer neue IP-Adressen hinzu und wertest dann am Ende die Liste mit den Adressen aus.


    Wer darauf nicht antwortet ist entweder nicht da oder antwortet generell nicht auf ICMP PING. So oder so würde Deine Methode ihn aber auch nicht finden.


    Vermutlich wäre es geiler, wenn man an die DHCP-Tabellen des Routers käme. Ist allerdings auch ein Sicherheitsrisiko.

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

  • ggf. kannst Du auch versuchen die ARP-Tabellen auszulesen. Da sollten alle in letzter Zeit auf dem Netz gesehenen IP-Adressen drin stehen. Details und Limitierungen kenne ich aber auch nicht.


    Noch ein Ansatz: ZeroConf. Da gibt es wohl auch einen Broadcast-Reply-Mechanismus. Allerdings müssen da alle Teilnehmer irgendwelche Dienste aktiv präsentieren wenn sie gefunden werden wollen.


  • Also zunächst mal ist Deine Lösung nicht gut.


    Weiss ich. Deswegen suche ich eine bessere



    Das lässt Du ein paar Sekunden laufen, parst die Rückgabewerte, fügst immer neue IP-Adressen hinzu und wertest dann am Ende die Liste mit den Adressen aus.


    Also da versteh ich nur Bahnhof ?(
    Wenn ich richtig verstehe soll ich die runtime benutzen.
    Aber wie kann ich die Antwort mit Java verarbeiten?

  • Zum Beispiel so:

    Java
    Runtime runtime = Runtime.getRuntime();
    proc = runtime.exec("ping -t 10 10.10.255.255); // -t 10 wartet 10 Sekunden und beendet dann den Ping.
    try {
      OutputStream pingOutputStream = proc.getOutputStream(); // Die Doku widerspricht sich hier und behauptet, man bekäme stdin – wäre aber Blödsinn
      // Hier unten kannst Du dann fröhlich Deinen hoffentlich fertigen OutputStream durchforsten.
    } 
    catch (InterruptedException e) {
      e.printStackTrace();
    }

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

  • Tut mir Leid. Ich habe mich nicht präzise genug ausgedrückt.
    Was ich nicht weiss, ist wie ich die IPs aus dem Stream ziehen kann. Deinem Code im ersten Kommentar zufolge ist die Antwort standartmässig 64 bytes gross. Das heisst wenn ich die bytes in 64ger Gruppen Teile erhalte ich eine vollständige Antwort auf den Ping
    Ich glaube allerdings kaum das in 64 bytes nur die IP passt.


    Leider konnte ich zum Aufbau dieser Pakete nichts finden...


    P.S. Ist vielleicht eine blöde Frage, aber ich komm nicht drauf.
    Wie kann man einen OUTPUTSTREAM einen Stream, mit dessen Hilfe man eigentlich was schreiben und nicht lesen kann "durchforsten"?

  • Gute Frage, die Doku lügt doch nicht, ich dachte nur falsch.
    Nimm den InputStream, den Du über den äquivalenten Weg bekommst. ;)


    Statt -t kannst Du beispielsweise auch '-c 5' nehmen. Dann bricht der nach 5 empfangenen Blöcken ab.


    Die Antwort, die 64 Bytes groß ist, ist die Antwort auf den Ping. Die Ausgabe selbst ist dieser Text.
    Mit RegEx Suchen auf die Strings kannst Du beispielsweise den Ping raussuchen.
    Oder Du erstellst Dir einen Substring aus jeder Zeile startend bei 14 und endend beim nächsten Leerzeichen.

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!