Alle IP-Adressen eines Netzwerks ermitteln



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



  • Fazit: Ich hatte unrecht und *jeder* Rechner in einem Segment muss auf einen ARP-Request antworten, sonst kann er gleich das Netzwerkkabel draussen lassen (ausser er will nur mithören 😉 )



  • Jochen Kalmbach schrieb:

    ausser er will nur mithören 😉

    ..oder er macht nur broadcasts 😃
    aber ich glaub' jetzt haben wir den op ganz verwirrt 😉



  • also ich habe mal mit der Funktion SendARP getestet. Wenn ich gezielt eine bekannte IP-Adresse in meinem Netz übergebe funktioniert es, aber sobald ich eine Schleife programmiere indem ich das letzte Byte der IP-Adresse hochzähle bekomme ich auch bei den vorhandenen Adressen eine Fehlermeldung.
    Warum?

    Wie kann ich eigentlich einen Ping absetzen. Eine Funktion SendPing gibt es ja nicht.



  • Uli schrieb:

    also ich habe mal mit der Funktion SendARP getestet. Wenn ich gezielt eine bekannte IP-Adresse in meinem Netz übergebe funktioniert es, aber sobald ich eine Schleife programmiere indem ich das letzte Byte der IP-Adresse hochzähle bekomme ich auch bei den vorhandenen Adressen eine Fehlermeldung.
    Warum?

    was für 'ne fehlermeldung? vielleicht schickst du die ARP's zu schnell hintereinander ab?

    Uli schrieb:

    Wie kann ich eigentlich einen Ping absetzen. Eine Funktion SendPing gibt es ja nicht.

    guckst du: http://www.sockets.com/ms_icmp.htm#Introduction



  • Bzgl. SendARP: Du musst vermutlich einen bestimmten Timeout abwarten... hab es aber noch nie probiert..

    Bzg. Ping: IcmpSendEcho(2)



  • das mit dem Timeout könnte sein. Ich hab das bis jetzt nur ohne Verzögerung probiert. Ist der Timeout eine feste Konstante, kann man die Zeit irgendwie Abfragen oder muß man sie empirisch ermitteln.



  • Hallo,

    ich hab's mal mit IcmpSendEcho probiert, wo man auch einen Timeout angeben kann. Es hat soweit funktioniert, allerdings dauert es natürlich bis er alle Adresse abgeklappert hat.



  • probier doch mal SendARP() gefolgt von 'nem Sleep(300) oder so. vielleicht ist das schneller. ich weiss aber nicht ob 'SendARP()' es nochmal versucht wenn keine antwort kam...


Anmelden zum Antworten