Alle IP-Adressen eines Netzwerks ermitteln



  • Hallo,
    ich suche gerade eine Funktion, mit der man alle IP-Adressen des eigenen Netzwerks ermitteln kann, also auch solche die nicht unter Netzwerklumgebung im Explorer angezeigt werden; z.B. Geräte, die kein PC sind (Netzwerkrouter etc.)

    Die Funktion WNetEnumResource hilft mir nicht weiter, weil sie nicht alle Geräte im Netzwerk liefert. Hat jemand eine Idee, oder schon soetwas gemacht?



  • Hmm, ich habe soetwas zwar noch nicht gemacht aber ich hätte eine Idee:

    Zuerst müsstest du nachschauen, in welchem Subnet du bist und daraus errechnen, welche IPs überhaupt in Frage kommen.

    Das Subnet: 255.255.255.0 wäre z.B. ein sogenanntes Class C netzwerk.
    d.h. alle Rechner zwischen 192.168.0.1 und 192.168.0.254 sind möglich (0 und 255 sind für andere Zwecke reserviert!)

    Nun schickst du einfach an jeden Rechner bzw. Netzwerkfähiges Gerät wie Router, Drucker, Xbox etc. ein Ping signal und wertest die IP adressen aus die geantwortet haben.
    Das ganze kannst du z.B. mit 50 Threads für 50IPs pro 10s machen, dann geht es etwas schneller.

    Ich empfehle dir, dich mit Subnetting auseinander zu setzen, falls du keine Ahnung hast. Du wirst es brauchen!

    Viel Glück!



  • also die Methode alle möglichen Adressen durchzuprobieren finde ich recht aufwendig. Außerdem dauert das zu lang wenn man beim starten eines Dialogs alle Geräte anzeigen möchte. In einem Netzwerk mit DHCP-Server müßte man diesen doch nach allen Client-Adressen fragen können.



  • Perner schrieb:

    Nun schickst du einfach an jeden Rechner bzw. Netzwerkfähiges Gerät wie Router, Drucker, Xbox etc. ein Ping signal und wertest die IP adressen aus die geantwortet haben.

    ja, so ein 'ping sweep' 😉
    oder man feuert massig ARP requests ab...



  • Hm. Kann man da nichts über die Broadcast Adresse machen?

    Mal abgesehen davon dass nicht jedes Gerät zurückpingt -- kann man eigentlich ein Ping auf die Broadcast Adresse schicken? Antworten die Geräte dann, oder ignorieren die das?



  • Das einzig sinnvolle ist in einem Ethernet-Netzwerk jeweils ein ARP-Request für alle IP-Adresse des Subnetzes zu verschicken. Wenn der Rechner lebt, wird er auf jeden Fall antworten.
    Ping geht wie gesagt nicht; da nicht alle Rechner auf ping antworten.

    Siehe "SendARP" in Iphlpapi.h/lib/dll.



  • Jochen Kalmbach schrieb:

    ...jeweils ein ARP-Request für alle IP-Adresse des Subnetzes zu verschicken.

    ein paar mehr dürfen's schon sein 😉



  • danke für den Hinweis auf SendARP. Die Idee ist zwar nicht schlecht, aber das Prinzip wäre ja das gleiche wie mit dem Ping-Befehl. Ich habe aber inzwischen mal in der Borland BDS Hilfe nachgelesen und die Funktion unter dem Oberbegriff "IP Helper Functions" gefunden. In dieser Funktionsgruppe gibt es auch die Funktion

    DWORD GetIpAddrTable(PMIB_IPADDRTABLE pIpAddrTable, PULONG pdwSize, BOOL bOrder);
    

    die genau das macht was ich gesucht habe.



  • Uli schrieb:

    DWORD GetIpAddrTable(PMIB_IPADDRTABLE pIpAddrTable, PULONG pdwSize, BOOL bOrder);
    

    die genau das macht was ich gesucht habe.

    damit kriegste aber nur die gepeicherten einträge aus'm ARP cache deines computers. um den schön voll zu kriegen, musste erstmal dafür sorgen, dass dein computer versucht, IP-pakete an alle anderen kisten zu schicken, z.b. mit pings (oder mit der von jochen genannten funktion manuell ARP-requests abschicken)...

    btw: arp-einträge verfallen nach ca. 4 stunden oder so, d.h. im cache sind auch einträge von computern die schon längst nicht mehr an sind.



  • Uli schrieb:

    danke für den Hinweis auf SendARP. Die Idee ist zwar nicht schlecht, aber das Prinzip wäre ja das gleiche wie mit dem Ping-Befehl.

    Was meinst Du jetzt damit?
    Bei einem "Ping" muss der Zielcomputer nicht antworten...
    Bei einem ARP-Request "muss" der Zielcomputer antworten, da sonst mit Ihm niemand eine Verbindung aufbauen kann... (ok im Speziallfall geht es auch ohne ARP-Response).



  • Jochen Kalmbach schrieb:

    Uli schrieb:

    danke für den Hinweis auf SendARP. Die Idee ist zwar nicht schlecht, aber das Prinzip wäre ja das gleiche wie mit dem Ping-Befehl.

    Was meinst Du jetzt damit?
    Bei einem "Ping" muss der Zielcomputer nicht antworten...
    Bei einem ARP-Request "muss" der Zielcomputer antworten, da sonst mit Ihm niemand eine Verbindung aufbauen kann... (ok im Speziallfall geht es auch ohne ARP-Response).

    Es muss je erst mal etwas an die Computer geschickt werden, damit ein ARP Request ausgelöst wird und die Tabelle aufgebaut wird. Also ist man sowieso wieder bei "jeden Anpingen", also ausprobieren welcher da sein könnte.



  • Jochen Kalmbach schrieb:

    (ok im Speziallfall geht es auch ohne ARP-Response).

    wie das?



  • Was meinst Du jetzt damit?

    ich meinte damit, dass mir das Prinzip eine Schleife mit Ping, oder ARP zu bauen zu lange dauert und auch aufwendig ist. Bei allen IP-Adressen, wo kein Teilnehmer vorhanden ist muss man ja den Timeout abwarten. Das würde in einem Class-C Netz und einer handvoll Rechner bedeuten ca. 250 mal Timeout.

    Wenn dieser ARP-Cache, wie net geschrieben hat u.U. nicht mehr aktuell ist, dann gibt es vielleicht noch eine einfachere Methode diesen zu aktualisieren. ich kenn mich mit den möglichen IP-Telegrammen nicht so aus, aber vielleicht gibt es ja eine bestimmte Broadcast-Message an alle, die bewirkt, dass sich jeder Teilnehmer im Netz einmal meldet?



  • Uli schrieb:

    aber vielleicht gibt es ja eine bestimmte Broadcast-Message an alle, die bewirkt, dass sich jeder Teilnehmer im Netz einmal meldet?

    boadcasts werden an die ethernet-adresse 0xffffffffffff geschickt, dafür ist leider kein ARP nötig d.h. es gibt keine antwort...



  • Uli schrieb:

    Was meinst Du jetzt damit?

    ich meinte damit, dass mir das Prinzip eine Schleife mit Ping, oder ARP zu bauen zu lange dauert und auch aufwendig ist.

    Die einfachste Methode ist: Frag Deinen gemanagten Switch! Der weiss welche es alle gibt!



  • Jochen Kalmbach schrieb:

    Die einfachste Methode ist: Frag Deinen gemanagten Switch! Der weiss welche es alle gibt!

    jochen, du machst mir angst 😉



  • net schrieb:

    Jochen Kalmbach schrieb:

    (ok im Speziallfall geht es auch ohne ARP-Response).

    wie das?

    So lange der Rechner *nur* Ausgehende Verbindungen hat und im Netzwerk mit Switches gearbeitet wird, wird für die "Rückauflösung" der IP-Adresse zum Rechner kein ARP-Request benötigt, da ja der Switch schon bei dem Verbindungsaufbau die IP-/MAC-Adresse bekommen hat.
    Somit muss also ein Rechner, der nur ausgehende Verbindungen hat keine ARP-Requests (in einem spezailfall der Netzwerkinfrastruktur) beantworten...



  • Jochen Kalmbach schrieb:

    Somit muss also ein Rechner, der nur ausgehende Verbindungen hat keine ARP-Requests (in einem spezailfall der Netzwerkinfrastruktur) beantworten...

    na, so einfach ist das nicht. du gehst davon aus, dass der rechner, der die verbindungsanfrage bekommt, sich die absenderadressen aus dem empfangenen ethernet-paket zieht und in seinen arp-cache packt? das ist aber ein sonderfall.
    normalerweise geht das so:

    rechner1
    --------
    1. anwendung auf rechner1 will tcp/ip zu verbindung zu rechner2 aufbauen
    2. eth adresse der gegenstelle nicht im cache? -> arp request wird geschickt
    3. arp response trudelt ein...

    rechner2
    --------
    1. tcp/ip verbindungsanfrage wird empfangen
    2. eth adresse der gegenstelle nicht im cache? -> arp request wird geschickt
    3. arp response trudelt ein...

    danach haben beide den eintrag im arp cache und es kann normal weitergehen.

    äääh, und ein switch hat darauf auch keinen einfluss, den interessieren nur die ethernet adressen, der kennt weder arp noch tcp/ip ...



  • Ich hab noch was vergessen... es muss noch Router dazwischen sein...



  • Jochen Kalmbach schrieb:

    es muss noch Router dazwischen sein...

    in dem fall 'faked' der router die arp-responses indem er seine eigene mac-adresse da reinpackt (die ip-adresse ist allerdings die vom zielrechner), aber am prinzip ändert sich nix 😉


Log in to reply