Hallo an all,
Ich möchte unter C++ gerne das Netzwerk scannen um herausfinden welche
Clients verfügbar sind.
Am Besten wäre wenn das noch plattformunabhängig wäre :) Generell hab
ich schon Qt durchgeschaut, eine solche Funktionalität auf anhieb nicht
gefunden.
Eine Möglichkeit wäre zB einen Broadcast Ping zu senden und auf die
Antwort zu warten - Dies hat jedoch den Nachteil dass es nicht
garantiert ist, dass jedes Gerät antwortet bzw. ob es überhaupt
funktioniert, denn Broad- oder Multicasts können generell deaktiviert
sein.
Welche Möglichkeiten bleiben mir des Problem am Besten zu lösen?
Danke im Voraus
Robert
Robert schrieb:> Welche Möglichkeiten bleiben mir des Problem am Besten zu lösen?
keines, es gibt keine Möglichkeit für einen 100% netwerkscann.
Man könnte jeden PC einzel anpingen, leider verhindert das sogar die
windowsfirewall wenn keine Freigaben vorhanden sind.
Man könnte jetzt noch einen Schritt weiter gehen und nach dem ping
schauen ob eine MAC-Adresse im arp-cache eingetragen wurde. Aber das
geht z.b. nich über Router grenzen hinweg,
QT seh ich als GUI Framework, du willst aber ein Netwerkscanner dafür
würde ich direkt die Betriessystem funktionen aufrufen.
Peter II schrieb:> Man könnte jeden PC einzel anpingen, leider verhindert das sogar die> windowsfirewall wenn keine Freigaben vorhanden sind.
Ja genau - Das ist das Problem.
> Man könnte jetzt noch einen Schritt weiter gehen und nach dem ping> schauen ob eine MAC-Adresse im arp-cache eingetragen wurde. Aber das> geht z.b. nich über Router grenzen hinweg,
Das ist schonmal ein guter Ansatz, danke. Das funktioniert auch wenn der
ping Befehl selbst nicht funktioniert. Funktioniert das auch so, wenn
ICMP Pakete vom Router deaktiviert sind?
> QT seh ich als GUI Framework, du willst aber ein Netwerkscanner dafür> würde ich direkt die Betriessystem funktionen aufrufen.
Ich möchte gerne so plattformunabhängig wie möglich bleiben, von daher
würd ich am Liebsten über eine API darauf zugreifen. Qt ist kein reines
GUI-Toolkit mehr.
Robert schrieb:> Hallo an all,>> Ich möchte unter C++ gerne das Netzwerk scannen um herausfinden welche> Clients verfügbar sind.
Clients für welches Protokoll?
> Eine Möglichkeit wäre zB einen Broadcast Ping zu senden und auf die> Antwort zu warten - Dies hat jedoch den Nachteil dass es nicht> garantiert ist, dass jedes Gerät antwortet bzw. ob es überhaupt> funktioniert, denn Broad- oder Multicasts können generell deaktiviert> sein.>> Welche Möglichkeiten bleiben mir des Problem am Besten zu lösen?
Kommt drauf an, was du konkret erreichen willst. Ein Broadcast-Ping sagt
dir ja nur, daß da irgendein Gerät ist, das irgendwelche Protokolle
unterstützen könnte, oder auch nicht.
Mit MDNS und DNS-SD können Geräte im lokalen Netz ihre Dienste anbieten,
so daß sie von einer entsprechenden Gegenstelle angezeigt werden. Siehe
UPNP, Zeroconf, Avahi und wie sie alle heißen.
Wenn's dir nur darum geht, eine Übersicht zu bekommen, was so im Netz
rumschwirrt, kannst du mal nmap ausprobieren (Achtung: Nur in deinem
eigenen Lan nutzen! Da man das zum Einbruch in fremde Netze nutzen kann,
wird es von Admins sehr ungern gesehen). Das ist ein Portscanner, der
dir auch sagt, welche Ports die Geräte so offen haben und ggf. unter
welchem Betriebssystem sie laufen.
Einfacher Weg: Die ARP- bzw. DHCP-Liste des Routers ansehen. Da stehen
allerdings auch Geräte drin, die grad nicht am Netz hängen.
Peter II schrieb:> QT seh ich als GUI Framework,
GUI ist nur eines der verschiedenen Module, aus denen Qt besteht.
Networking ein anderes.
Rolf Magnus schrieb:>> Ich möchte unter C++ gerne das Netzwerk scannen um herausfinden welche>> Clients verfügbar sind.>> Clients für welches Protokoll?
Im Moment unspezifiziert. Wird ein eigenes Protokoll, dass au TCP/IP
rausläuft.
Rolf Magnus schrieb:> Wenn's dir nur darum geht, eine Übersicht zu bekommen, was so im Netz> rumschwirrt, kannst du mal nmap ausprobieren
nmap kenne ich habe ich auch im Einsatz. Nur soll das ja schließlich in
einem anderen Programm passieren.
Generell möchte ich das Netzwerk scannen um Geräte anzeigen zu lassen
mit denen ich mich verbinden könnte, mit meinem noch unspezifizierten
Protokoll ;) Sprich Port wird feststehen auf dem ich kommunizieren will.
Robert schrieb:> Das ist schonmal ein guter Ansatz, danke. Das funktioniert auch wenn der> ping Befehl selbst nicht funktioniert.
ja
> Funktioniert das auch so, wenn ICMP Pakete vom Router deaktiviert sind?
was hat das jetzt mit einem router zu tun? Über router hinweg kann man
eh nicht mit mac adressen arbeitetn. Und der Router kann ja kaum
verhindert das du anderen PCs im Netwerk anpingen kannst.
Robert schrieb:> Hallo an all,>> Ich möchte unter C++ gerne das Netzwerk scannen um herausfinden welche> Clients verfügbar sind.
Ja, und das Problem ist genau was? ;-)
> Am Besten wäre wenn das noch plattformunabhängig wäre :) Generell hab> ich schon Qt durchgeschaut, eine solche Funktionalität auf anhieb nicht> gefunden.>> Eine Möglichkeit wäre zB einen Broadcast Ping zu senden und auf die> Antwort zu warten - Dies hat jedoch den Nachteil dass es nicht> garantiert ist, dass jedes Gerät antwortet bzw. ob es überhaupt> funktioniert, denn Broad- oder Multicasts können generell deaktiviert> sein.
Das funktioniert prinzipiell nicht.
> Welche Möglichkeiten bleiben mir des Problem am Besten zu lösen?
Die offensichtliche.
Um festzustellen ob Du einen (potentiellen) Client erreichen kannst ist
die einzige Möglichkeit eine Verbindung mit dem gewünschten Protokoll zu
ihm aufzubauen.
Alle anderen Möglichkeiten funktionieren nicht weil eine Antwort auf ein
Ping (usw. usf.) halt nicht bedeutet dass eine Verbindung auf UDP/TCP
Port X nicht gefiltert/geblockt würde.
Jedes Netzwerk ist ein Dschungel, und NAT, Firewalls, Blah sind seine
Raubtiere/Killer.
Schau dir mal die manpage zu nmap an. Es gibt X Varianten, wie man den
genannten Problemen begegnen kann. Voraussetzung ist allerdings schon,
dass es nicht schon auf deinem eigenen Rechner klemmt (host based
firewall und solchen Kramsch).