Schnell alle lokale IPs finden

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

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

    Quellcode

    1. ping 10.20.10.255 //ggf. muss mit -b spezifiziert werden, dass man definitiv die broadcast ip pingen möchte
    2. PING 10.20.10.255 (10.20.10.255): 56 data bytes
    3. 64 bytes from 10.20.10.128: icmp_seq=0 ttl=64 time=0.052 ms
    4. 64 bytes from 10.20.10.40: icmp_seq=0 ttl=64 time=0.492 ms
    5. 64 bytes from 10.20.10.113: icmp_seq=0 ttl=64 time=0.784 ms
    6. 64 bytes from 10.20.10.117: icmp_seq=0 ttl=64 time=0.788 ms
    7. 64 bytes from 10.20.10.139: icmp_seq=0 ttl=64 time=0.828 ms
    8. 64 bytes from 10.20.10.31: icmp_seq=0 ttl=64 time=0.881 ms
    9. 64 bytes from 10.20.10.52: icmp_seq=0 ttl=60 time=1.193 ms
    10. 64 bytes from 10.20.10.50: icmp_seq=0 ttl=60 time=1.253 ms
    11. 64 bytes from 10.20.10.51: icmp_seq=0 ttl=60 time=1.257 ms
    12. 64 bytes from 10.20.10.12: icmp_seq=0 ttl=255 time=2.314 ms
    13. 64 bytes from 10.20.10.11: icmp_seq=0 ttl=255 time=3.214 ms
    14. 64 bytes from 10.20.10.121: icmp_seq=0 ttl=64 time=99.143 ms
    15. 64 bytes from 10.20.10.114: icmp_seq=0 ttl=255 time=140.803 ms
    16. 64 bytes from 10.20.10.128: icmp_seq=1 ttl=64 time=0.062 ms
    17. 64 bytes from 10.20.10.40: icmp_seq=1 ttl=64 time=0.232 ms
    18. 64 bytes from 10.20.10.113: icmp_seq=1 ttl=64 time=0.390 ms
    19. 64 bytes from 10.20.10.117: icmp_seq=1 ttl=64 time=0.395 ms
    20. 64 bytes from 10.20.10.31: icmp_seq=1 ttl=64 time=0.397 ms
    21. 64 bytes from 10.20.10.52: icmp_seq=1 ttl=60 time=0.490 ms
    22. 64 bytes from 10.20.10.139: icmp_seq=1 ttl=64 time=0.495 ms
    23. 64 bytes from 10.20.10.50: icmp_seq=1 ttl=60 time=0.516 ms
    24. 64 bytes from 10.20.10.51: icmp_seq=1 ttl=60 time=0.519 ms
    25. 64 bytes from 10.20.10.11: icmp_seq=1 ttl=255 time=0.942 ms
    26. 64 bytes from 10.20.10.12: icmp_seq=1 ttl=255 time=0.949 ms
    27. 64 bytes from 10.20.10.121: icmp_seq=1 ttl=64 time=326.373 ms
    28. 64 bytes from 10.20.10.128: icmp_seq=2 ttl=64 time=0.075 ms
    29. 64 bytes from 10.20.10.117: icmp_seq=2 ttl=64 time=0.239 ms
    30. 64 bytes from 10.20.10.40: icmp_seq=2 ttl=64 time=0.245 ms
    31. 64 bytes from 10.20.10.139: icmp_seq=2 ttl=64 time=0.344 ms
    32. 64 bytes from 10.20.10.113: icmp_seq=2 ttl=64 time=0.396 ms
    33. 64 bytes from 10.20.10.31: icmp_seq=2 ttl=64 time=0.448 ms
    34. 64 bytes from 10.20.10.52: icmp_seq=2 ttl=60 time=0.472 ms
    35. 64 bytes from 10.20.10.50: icmp_seq=2 ttl=60 time=0.527 ms
    36. 64 bytes from 10.20.10.51: icmp_seq=2 ttl=60 time=0.531 ms
    37. 64 bytes from 10.20.10.11: icmp_seq=2 ttl=255 time=0.930 ms
    38. 64 bytes from 10.20.10.12: icmp_seq=2 ttl=255 time=1.451 ms
    39. 64 bytes from 10.20.10.114: icmp_seq=2 ttl=255 time=228.889 ms
    40. 64 bytes from 10.20.10.121: icmp_seq=2 ttl=64 time=246.799 ms
    Alles anzeigen

    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.
  • Marco Feltmann schrieb:


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

    Weiss ich. Deswegen suche ich eine bessere

    Marco Feltmann schrieb:


    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-Quellcode

    1. Runtime runtime = Runtime.getRuntime();
    2. proc = runtime.exec("ping -t 10 10.10.255.255); // -t 10 wartet 10 Sekunden und beendet dann den Ping.
    3. try {
    4. OutputStream pingOutputStream = proc.getOutputStream(); // Die Doku widerspricht sich hier und behauptet, man bekäme stdin – wäre aber Blödsinn
    5. // Hier unten kannst Du dann fröhlich Deinen hoffentlich fertigen OutputStream durchforsten.
    6. }
    7. catch (InterruptedException e) {
    8. e.printStackTrace();
    9. }
    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"?

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von A13X ()

  • 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!«