Forum: PC-Programmierung [C++] Netzwerk Scan


von Robert (Gast)


Lesenswert?

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

von Peter II (Gast)


Lesenswert?

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.

von Robert (Gast)


Lesenswert?

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.

von Rolf Magnus (Gast)


Lesenswert?

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.

von Robert (Gast)


Lesenswert?

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.

von Peter II (Gast)


Lesenswert?

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.

von Jasch (Gast)


Lesenswert?

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.

von Mutzel (Gast)


Lesenswert?

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).

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.