Automatisch alle IP Adressen im Netzwerk ermitteln - schnellste Methode



  • Hallo,

    ich bin auf der Suche nach einem schlauen Weg möglichst fix alle IP Adressen im Netzwerk zu ermitteln. Das ganze sollte plattformunabhängig sein.

    Dazu habe ich bisher die Boost Library angezogen.

    Eigentlich dachte ich dass ein Broadcast Ping die ideale Lösung dazu wäre musste aber schmerzlich feststellen das ein Ping z.B. auf die 192.168.0.255 trotz einer Netwerkmaske von 255.255.255.0 nicht dazu führt dass alle Rechner und Geräte in meinem Netwerk darauf antworten. Bei meinem Mac antwortet sogar nur der gleiche Rechner selbst, deshalb vermute ich dass der Broadcast Ping entweder nicht weitergereicht, oder die Rechner/Geräte die Anfrage ignorieren.

    Jetzt zur eigentlichen Frage:
    Wie löst man dass am cleversten? Einfach durchpingen durch alle Rechner finde ich nicht sehr effizient. Ein Broadcast wäre mir da schon lieber. Aber mit Broadcast Pings klappt das anscheinend nicht. Wie löst das ARP, NMAP und co?
    Gehen die auf Ethernet level runter?

    Grüße,

    Wolfgang



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (alle ISO-Standards) in das Forum Rund um die Programmierung verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


  • Mod

    Procrash schrieb:

    Gehen die auf Ethernet level runter?

    Was möchtest du erreichen? Wenn du Information auf IP-Ebene möchtest, dann wird es dir wenig nutzen, auf Ethernet-Ebene runter zu gehen. Wenn jemand im IP-Netz¹ nicht gefunden werden möchte und sich einfach tot stellt, dann wirst du ihn auch nicht finden.

    ¹: Denk dran, dass ein IP-Netz nicht notwendigerweise identisch ist mit "alles was irgendwie physisch an meinem Heimswitch angeschlossen ist". Daher wäre es gut, wenn du wirklich sagst, worum es dir geht und nicht, wie du dein Ziel erreichen möchtest.



  • Naja im Grunde genommen geht es mir NICHT darum Geräte zu finden die nicht gefunden werden wollen, sondern eigentlich nur darum die IP Adressen aller am Netz angeschlossenen Teilnehmer zu ermitteln.

    Mit Level runter gehen kann das durchaus sinnvoll sein denke ich da ARP ja im Grunde genommen nichts anderes macht oder? An alle Ethernet Teilnehmer ein Broadcast Paket schicken um herauszufinden welches Ethernet Gerät die gesuchte IP Adresse besitzt. Das passiert so wie ich das verstanden habe auf Ethernet Ebene per Broadcast wobei derjenige Teilnehmer der sich angesprochen fühlt weil er die IP Adresse besitzt als einziger antwortet.

    Jetzt ist die Problemstellung jedoch doch eine andere. Ich will alle IP Adressen aller Geräte wissen und das möglichst ohne mich durchfragen zu müssen (also bei einem 255.255.255.0 Netz 253 Geäte nacheinander anzupingen.



  • procrash2000 schrieb:

    Mit Level runter gehen kann das durchaus sinnvoll sein denke ich da ARP ja im Grunde genommen nichts anderes macht oder?

    arp sendet nen (ethernet)broadcast mit der ip des zielrechners. er antwortet, wenn er ein solches paket empfängt. das kommt dem nah was du willst.

    mit sockets geht das aber nicht. du brauchst also nen packet-driver oder eine möglichkeit, auf den arp-stack deines computers zuzugreifen.


  • Mod

    Ich fürchte, um das Durchgehen aller potentiellen Adressen wirst du nicht herum kommen, wenn die Geräte auf einen Broadcast nicht antworten. Wenn du wirklich gründlich vorgehen möchtest, dann auch mit mehr als nur Ping, da ein Gerät eventuell nicht auf Ping antwortet. Das ist der Grund, warum Werkzeuge wie nmap eine Weile brauchen. Wo wir beim Thema sind: nmap? Das (und andere vergleichbare Programme) machen doch schon, was du möchtest und die Macher haben da bestimmt viel mehr Forschungsarbeit rein gesteckt, wie man das geschickt macht, als du es alleine jemals könntest. Warum nutzt du nicht die? Lerneffekt?



  • nmap wurde schon erwähnt.
    Eine ganz banale Lösung wäre auch, auf jedem Rechner einen Dienst laufen zu lassen, der, wenn das Netzwerk verfügbar ist, einen ping oder sonst ein Paket an einen Server sendet. Dadurch hat er sich angemeldet. Man könnte das Konzept auch dahingehend erweitern, dass wenn sich ein Rechner sich innerhalb eines bestimmten Zeitraums nicht neu gemeldet hat, dieser wahrscheinlich abgemeldet ist.
    So einen Dienst wirst du womöglich selber schreiben müssen.



  • ShadowClone schrieb:

    So einen Dienst wirst du womöglich selber schreiben müssen.

    gibt es schon, nennt sich gratuitous arp.



  • Gibt es eine Möglichkeit ganz allgemein auf empfangene Pakete zu antworten?

    Wie sähe so ein Dienst Source Code technisch aus? Am liebsten wäre mir natürlich eine Boost Implementierung da sowas plattformunabhängig ist.



  • Procrash schrieb:

    Gibt es eine Möglichkeit ganz allgemein auf empfangene Pakete zu antworten?

    Wie sähe so ein Dienst Source Code technisch aus? Am liebsten wäre mir natürlich eine Boost Implementierung da sowas plattformunabhängig ist.

    Ich verstehe nicht, wo das Problem bei den hier vorgestellten Lösungen ist.

    Wenn du übrigens etwas mit Netzwerk haben willst und möglichst kleine Abhängigkeiten, dann würde ich nicht unbedingt C++ nehmen. Du kannst z. B. rust nehmen. Das hat von Haus aus eine plattformunabhängige Netzwerkimplementierung.

    Aber wie gesagt: Es wurden hier existierende Lösungen vorgestellt. Was ist hier dein Ziel? Lerneffekt oder willst du einfach eine Lösung?



  • wenn du es dir selber programmieren möchtest schau dir das mal an.
    https://de.wikipedia.org/wiki/Pcap

    "Die API ist so aufgebaut, dass sie direkt von C und C++ eingebunden werden kann. Andere Programmiersprachen wie Java, .NET oder Skriptsprachen benutzen normalerweise einen Wrapper."

    c++ ist dafür eig auch ganz gut geeignet, soweit ich weiß. 🙄

    nmap greift auch auf pcap zurück, soweit ich weiß (glaube steht auch im beitrag).

    lg


Anmelden zum Antworten