Alle Computer eines Netzwerkes finden

Hallo Leute,
ich bin zum ersten Mal hier, hätte aber ne Frage...

Also, welche Möglichkeiten habe ich, alle Rechner in einem Netzwerk zu listen?

Ich habe bereits ein Programm geschrieben, tut auch was es soll, jedoch ist es sehr ineffizient, denn es checkt alle IP-Adressen zwischen zwei IP's ob sie erreichbar sind mit isReachable(). Leider muss ich den timeOut auf ca. 2000ms stellen, sonst "übersieht" er einige Rechner und mein Laptop findet er gar nicht. Bei nem Klasse C Netz dauert der Spaß für alle 254 Adressen dann um die 8-10min.

isReachable() wird ja realisiert über das ECHO-Protokoll, was hab ich sonst für Möglichkeiten? Ping geht ja bei Java nicht direkt und wär eigentlich auch nicht schneller.
Ne Anfrage über Broadcast auf den alle aktiven Rechner antworten, geht sowas?
Wie stehts mit ARP, NetBios/SMB, LLMNR?

Ich hoffe ihr könnt mir helfen
 

Spitfire777

Bekanntes Mitglied
Hast du die Möglichkeit, auf allen Rechnern ein Programm auszuführen?

Evtl. könnte sich dann jeder PC sich bei dir anmelden, bzw. er hochgefahren ist, bzw. abmelden, wenn er nicht mehr erreichbar ist.
 
G

Gast2

Gast
Also, welche Möglichkeiten habe ich, alle Rechner in einem Netzwerk zu listen?
zur 100% genau - einzig und alleine mit dem Vorschlag von Spitfire777

Ich habe bereits ein Programm geschrieben, tut auch was es soll, jedoch ist es sehr ineffizient, denn es checkt alle IP-Adressen zwischen zwei IP's ob sie erreichbar sind mit isReachable().
[c]isReachable[/c] ist kein Ping! ... auberer geht es mit Ping - kann Java aber nicht ... nur über Runtime & Konsole ... dann kann Dir aber auch noch die Firewall des entsprechenden angepingten Rechners dazwischen funken ... Ping wird geblock - Rechner ist aber da

Ne Anfrage über Broadcast auf den alle aktiven Rechner antworten, geht sowas?
wäre unterm Strich wie der Vorschlag von Spitfire777

hand, mogel
 
weiß ja, dass isReachable kein ping ist und dass Java das nicht kann.
Aber was ist dann die bestmögliche Methode, mit der man möglichst fast alle finden kann? Mir ist schon klar, dass man ein Rechner "unsichtbar" betreiben kann.
Was is mit nem ARP-Request? Der dürfte doch eigentlich immer gehn, wer ist schon so paranoid und blockt sowas? Nur wie könnt ich den realisieren?
 

Ark

Top Contributor
Je nachdem, wie viel oder wenig Java erlaubt ist (in meinem Fall wohl eher weniger :D): nmap ;)

Wobei ich denke, dass eventuell bessere Lösungen vorgeschlagen werden könnten, wenn du mehr davon erzähltest, was du erreichen möchtest.

Ark
 
wollte es möglichst selbst machen :D

naja also, ich hab mich geärgert, dass die Windows Netzwerkumgebung, net view, etc. nicht immer alle Rechner finden, ich weiß dass die Netzwerkumgebung nur die findet, die das aktiviert haben und/oder Freigaben eingerichtet haben. Dann ist mir aufgefallen, dass verschiedene SMB-clients auch verschieden viele Treffer erzielen. Da dacht ich mir, dass kann doch nicht so schwer sein, ein Tool zu proggen, dass so gut wie alle findet.
Wenn ich die ARP-Tabelle von Windows aufrufe, sieht das Ergebnis schon sehr viel versprechend aus, aber die scheint nur die zu listen, mit denen bereits Netzwerkverkehr bestanden hat.
Falls ich also ARP verwenden sollte, komm ich auch nicht daran vorbei, die Adress-Auflösung bei jeder IP des Netzes zu versuchen.

Mein Ziel ist also, ein Tool zu schreiben, dass schneller/effizienter als mein aktuelles, alle verfügbaren Rechner in einem Netz listen kann. Am besten mit einer Broadcast request, auf die alle Rechner antworten. Aber, dass scheint ja nicht möglich... :-(
 

Grey_M

Aktives Mitglied
Kleine Idee. Also Portsniffer scannen ja auch alle verfügbaren Ports, machen das aber über Threads.

Wenn du wirklich alles wissen willst, dann musst du wohl alle möglichen IPs (254 wie du oben gesagt hast) scannen.

Starte dazu doch einfach 254 Threads. :) Viel Logik führst du da drin ja nicht aus und ob da kurz mal 254 Threads laufen stört auch niemanden.

Im Notfall begrenzt du das ganze halt auf 10, 20, 30, .... Threads.
 
Ja die Idee ist mir auch schon gekommen, muss nur gucken wie das mit der Synchronisation klappt wenn 254 Threads nahezu gleichzeitig auf ne Liste zugreifen möchten :D
 
M

maki

Gast
254 Threads sind nicht sinnvoll, wenn man sich überlegt wieviele davon wirklich gleichzeitig laufen könnten, im besten Falle.
 

Grey_M

Aktives Mitglied
254 Threads sind nicht sinnvoll, wenn man sich überlegt wieviele davon wirklich gleichzeitig laufen könnten, im besten Falle.

Die Hauptaufgabe der Threads besteht darin auf isReachable() zu warten. Da können meiner Meinung nach 254 Threads gleichzeitig warten....

Was soll darin schlimm sein?

EDIT:
Ja die Idee ist mir auch schon gekommen, muss nur gucken wie das mit der Synchronisation klappt wenn 254 Threads nahezu gleichzeitig auf ne Liste zugreifen möchten

Entweder baust du dir eine Eigene Klasse die die Zugriffe synchronisiert, oder du benutzt z.B.

  • Hashtable
  • Java:
    Map m = Collections.synchronizedMap(new HashMap(...));
  • ... (Gibt genug synchronisierte Collections)
 
Zuletzt bearbeitet:
Bei Gelegenheit versuch ichs mal, denke auch, dass 254 Threads vielleicht ein Bisschen viel sind. Wenns 25 sind und der Timeout bei 2sec steht, dann hab ich ein komplettes Klasse C Netz in 20sec gescannt, ist doch akzeptabel ;-)
 

Grey_M

Aktives Mitglied
Bei Gelegenheit versuch ichs mal, denke auch, dass 254 Threads vielleicht ein Bisschen viel sind. Wenns 25 sind und der Timeout bei 2sec steht, dann hab ich ein komplettes Klasse C Netz in 20sec gescannt, ist doch akzeptabel

Könntest du dann bitte dein Ergebnis posten. Würde mich interessieren was im Endeffekt "schneller" / "effektiver" läuft. Ich spekuliere darauf, dass du die 254 Threads in max. 2 Sekunden erzeugt hast. Das isReachable() selbst läuft vermutlich über Events/Requests und verbraucht ziemlich wenig Performance während dem Warten.
Mit wenigeren Threads senkst du vermutlich die max. Last, aber benötigst länger.

Im Endeffekt musst du halt deine Balance finden. :)
 
ok, mach ich.
Pro IP ein Thread ist aber auch, glaub ich, auf jeden Fall einfacher umzusetzen, weil sonst muss den Adressbreich noch für jeden Thread einteilen
 
so also, ist umgesetzt. Läuft jetzt echt unglaublich schnell :)
Für ein Klasse C Netz braucht er mit 100 Threads knapp 8 Sekunden statt mit einem fast 10min.
Mit mehr Threads noch schneller, ganz anders als ich eigendlich erwartet hab.
Scheint auch keine große Beschränkung in der Anzahl der Threads zu geben, denn auch mit 10000 tut er es :D
Nur dann bringt der Scheduler schon 50% CPU Auslastung...
 

Grey_M

Aktives Mitglied
Danke für das Posten vom Ergebnis CaptnCAPSLOCK. Dachte mir schon das sowas in der Art rauskommt. Die Threads machen ja nicht wirklich viel. ;)

Dann mal weiterhin viel Spaß beim scannen. :)


Was eventuell noch eine interessant Überlegung wäre. Wenn Thread1 isReachable() aufruft wird Thread2 gestartet, welcher dann bei isReachable() Thread3 startet, der dann wieder......

Dadurch würde im Endeffekt immer nur ein Thread die CPU beschäftigen, die anderen warten ja auf isReachable() :) Ich denke aber dass nicht soooo viel bringen wird.
 

HoaX

Top Contributor
Was eventuell noch eine interessant Überlegung wäre. Wenn Thread1 isReachable() aufruft wird Thread2 gestartet, welcher dann bei isReachable() Thread3 startet, der dann wieder......

Dadurch würde im Endeffekt immer nur ein Thread die CPU beschäftigen, die anderen warten ja auf isReachable() :) Ich denke aber dass nicht soooo viel bringen wird.

Vorallem wird das nicht funktionieren, denn der nächste Thread muss ja dann entweder vor oder nach dem eigentlichen isReachable gestartet werden. Kommt der Aufruf vorher, dann laufen alle Threads gleichzeitig. Und je nach dem ob isReachable Erfolg hat laufen durchaus auch mehrere gleichtzeitig. Verhält sich so wie der bisherige Ansatz. Das bisschen Versatz zwischen dem Starten der Threads bringt garnichts.
Wird der nächste Thread erst nach dem isReachable gestartet, dann könnte man gleich auf Threads verzichten.
 
hast Du ein komplettes /24 Netz aufgebaut - mit 253 Rechnern? ... glaube wohl nicht ... damit sind die Werte nicht sehr Aussagekräftig

erstens Mal hat ein /24 Netz 254 Rechner ;)
und zweitens wäre das Ergebnis noch schneller, wenn wirklich so viele Rechner drin sind, denn dann muss er nicht bei jeder nicht erreichbaren IP auf die 2sec TimeOut warten. Ein erreichbarer Rechner antwortet nämlich schneller...

Aber es waren natürlich keine 254 Rechner anwesend, jedoch hab ichs an nem /24er Netz der Uni getestet und da sind doch einige Rechner drin.
 
G

Gast2

Gast
erstens Mal hat ein /24 Netz 254 Rechner ;)
253 Rechner + 1 Gateway :oops:

und zweitens wäre das Ergebnis noch schneller, wenn wirklich so viele Rechner drin sind, denn dann muss er nicht bei jeder nicht erreichbaren IP auf die 2sec TimeOut warten. Ein erreichbarer Rechner antwortet nämlich schneller...
es geht (mir) hier nicht um die Endgeschwindigkeit bzw. laufzeit des gesamten Programms ... sondern einfach darum ab welcher Rechneranzahl schmeißt das Netzwerk Pakete weg

hand, mogel
 
Ein Gateway is nicht zwingend erforderlich für die Kommunikation innerhalb eines Netzes, desweiteren wird der ja auch durch eine Art Computer realisiert, aber das spielt ja alles keine Rolle und wir könnten uns ewig drum streiten... :D

Zur anderen Sache: Testweise hab ich mal jedem Rechner im Netz knappt 15 IP's zugeteilt. Ist natürlich nicht das selbe aber füllt das Netz ja auch und es wurde jeder Host gefunden, mit all seinen Adressen.
 
D

despikyxd

Gast
254 Threads sind nicht sinnvoll, wenn man sich überlegt wieviele davon wirklich gleichzeitig laufen könnten, im besten Falle.

soll ich dir das jetzt wirklich erklären ?
mich kümmert es wenig das du MOD bist ... aber scheinbar hast du hier in diesem punkt nicht das nötige hintergrundwissen welches ich dir erläutern möchte um dir zu zeigen das MEHR threads durchaus auch sinnvoller ist

beschäftigen wir uns erstmal mit den basics
MutliTasking MultiThreading sowie dem wohl eher unbekanterem MultiPreccesing

MultiTasking : das OS oder besser gesagt dessen kernel ist in der lage mehrere Tasks scheinbar gleichzeitig auszuführen
die wirklichkeit sieht aber anders aus : das kernel ist der einzige Task der physisch läuft ... über diesen einen Task werden nun die anderen ausgeführt ... also so das die Tasks durch das kernel in den CPU-core gelangen ...
um das ganze jetzt aber scheinbar gleichzeitig auszuführen schaltet das kernel durch die einzelnen Tasks in einer sehr hohen geschwindigkeit durch ...
hier besteht zwar die möglichkeit das mehrere programme scheinbar gleichzeitig laufen können ... aber jeder Task immer noch auf je einen Thread beschränkt ist

MultiThreading : baut auf MultiTasking auf ... einzige erweiterung hier ist das während durch die Tasks geschaltet wird auch immer wieder andere Threads an die reihe kommen ... so kommt es vor das manchmal ein und der selbe Thread öfter hinter ein ander ausgewählt wird und andere warten müssen ... aber auch das irgendwann mal so geschaltet wird das mehrere Threads gleich oft drankommen ... dass ganze ist n ziemlich schwieriger haufen rechnerei ...

MultiProcessing : wurde erst mit der erfindung der mehr-Kern-CPUs möglich ... hierbei werden in einem Taktzyklus in der entsprechenden anzahl kerne nun erstmals wirklich real gleichzeitig unterschiedliche prozesses verarbeitet ...
hierbei kann es vorkommen das nun zufällig von einem programm mehrere Threads gleichzeitig in den stacks liegen oder eben halt andere prozesse ...

an dieser erklärung kann man sich sehr einfach ableiten das man mit zunehmender anzahl an Threads immer weniger zeit braucht

kleines rechenbeispiel

du hast 10 Threads die einen stack von sagen wir mal 200 aufgaben abzuarbeiten haben ...nun musst du schön geduldig abwarten bis einer dieser 10 Threads seine aufgabe erledigt hat und nun die nächste in angriff nimmt ...
die effektive zeit die dabei eine aufgabe im cpu verbringt ist ziemlich hoch da es auch mal vorkommen kann das der ein oder andere thread sehr selten an die reihe kommt ... in dieser zeit allerdings nicht die anderen 9 öfter drin sind sondern auch Threads von anderen programmen ... heißt also das es auch mal vorkommen kann das eine größere anzahl der Threads selten dran kommt ...
nun musst du also schön warten bis die Threads der ihre aufgaben in langer mühseliger wartezeit beendet haben ...

erhöst du nun die anzahl der Threads auf sagen wir mal 100 ... erhöchst du damit die warscheinlichkeit das in der zeit wo ein Thread pause schiebt ein anderer Thread des selben programmes an die reihe kommt ... du also in der zeit wo eine aufgabe wartet nicht auf einen anderen prozess wartest sondern viel eher auf eine andere rechnung im stack
dadurch ist dann das programm viel eher mit seinen 200 aufgaben fertig da die effektiv genutzte cpu-zeit stärker ausgelastet wird ... du also viel öfter mit den Threads deine Prozesses an die reihe kommst als wenn du nur 10 Threads nutzt

erhöst du nun die anzahl der Threads auf das maximum der größe des stacks ... so arbeitest du ab effektivsten *und damit verbunden auch am schnellsten* ... grund ist das du damit die warscheinlichkeit das einer deiner Threads im cpu-core ist und nich der Thread eines anderen Prozesses maximiert hast ...

und nun möchte ich mal von dir so ausführlich erklärt haben warum das alles hier falsch sein sollte und es besser ist weniger Threads mit mehr aufgaben vollzustopfen anstatt diese auf eine größere anzahl Threads zu verteilen ...

in diesem sinne
 
D

despikyxd

Gast
CaptnCAPSLOCK hat gesagt.:
erstens Mal hat ein /24 Netz 254 Rechner
mogel hat gesagt.:
253 Rechner + 1 Gateway

ähäm ... BEIDE falsch

ein /24er netz kann max 253 unterschiedliche geräte ansprechen egal ob rechner , gateway oder sonstwas
grund ist das sowohl die vermeintlich 1te adresse xxx.xxx.xxx.0 und die vermeintlich letzte xxx.xxx.xxx.255 keinem gerät gesondert zuweisen lassen ... womit bei 255 zwei rausfliegen was 253 verfügbare adresse macht
weil 0 ist das netz selbst und 255 die sog. broadcast adresse ... und diese beiden adressen sind reserviert und können nicht zugewiesen werden ...
nur um euch beide mal zu korrigieren ...
 
ähäm ... BEIDE falsch

ein /24er netz kann max 253 unterschiedliche geräte ansprechen egal ob rechner , gateway oder sonstwas
grund ist das sowohl die vermeintlich 1te adresse xxx.xxx.xxx.0 und die vermeintlich letzte xxx.xxx.xxx.255 keinem gerät gesondert zuweisen lassen ... womit bei 255 zwei rausfliegen was 253 verfügbare adresse macht
weil 0 ist das netz selbst und 255 die sog. broadcast adresse ... und diese beiden adressen sind reserviert und können nicht zugewiesen werden ...
nur um euch beide mal zu korrigieren ...

nein du gehst von nur 255 Adressen insgesamt aus, dass man die erste und letzte Adresse wegen Netzadresse und Broadcast nicht verwenden kann ist richtig. Aber man fängt bei 0 an zu zählen und bis 255 sind es 256 Adressen, kannst auch einfach 2^8 rechnen ;-)
Minus Netzadresse und Broadcast bleiben dann 254, war schon richtig...
 
D

despikyxd

Gast
FAILED ... ja ok .. hast recht ... mit meinen 255 habe ich ja entweder die broadcast- oder die netz-adresse schon abgezogen
natürlich fängt man bei 0 an und geht dann bis einschließlich 255 ... was natürlich völlig richtig dann gesamt 256 macht ... weniger netz- und broadcast-adresse bleiben 254 übrig ...

ja tut mir sorry für alle flamer und mods und und und die jetzt ankommen und mich vollheulen vonwegen das ich erstmal kopp anstelln sollte ...
na und ... ich bin halt auch nich fehlerlos und stolper über solche sachen ... weil natürlich sind 2^8 256 ...

peinlich peinlich sowas ^^
 
G

Gast2

Gast
Der Rest ist mir zu lang zu lesen...:gaen:
großes Geblubber von MultiTask und MultiProcessing und solchen Krempel um Dir beweisen zu können das es sinnvoll ist mehrer Threads zu haben ... allerdings hat er den Contextwechsel vergessen - welche in diesem Fall mehr CPU-Last erzeugt als das anpingen der einzelnen Rechner ... womit eigentlich bewiesen ist das hier soviele Threads unsinnig sind

ansonsten - willst Du auch noch was von meinem Popcorn :D

hand, mogel
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Socket Senden an alle verbundenen Clients Netzwerkprogrammierung 3
X Kann ich einen Client/Server verbindung hinkriegen die mir alle paar Sekunden die aktuellen Daten per Realtime zuschickt ? Netzwerkprogrammierung 9
M MultiClient Server - Senden an alle Clients Netzwerkprogrammierung 8
M Teilnehmerliste vom Server auch an alle Clients senden Netzwerkprogrammierung 0
M Erreichbar für alle zu sein Netzwerkprogrammierung 9
N Selbes URL Objekt für alle Requests nutzen Netzwerkprogrammierung 7
M Datenübertragung per Socket nur alle 200ms Netzwerkprogrammierung 4
E Alle IPs im Lan herausfinden und zwischenspeichern? Netzwerkprogrammierung 4
c_sidi90 Alle Rechner im Netzwerk ermitteln Netzwerkprogrammierung 17
V Alle Ip-Adressen eine Lokalen-Netzwerkes erfragen Netzwerkprogrammierung 9
T JavaMail POP Zugriff zeigt nicht alle Emails Netzwerkprogrammierung 2
H Neues NIO problem nachricht an alle clients Netzwerkprogrammierung 3
G alle 20 sec ein 2 sekunden Lag im Java-Spiel Netzwerkprogrammierung 13
A Broadcast - senden eines Packetes an alle rechner im netz Netzwerkprogrammierung 15
M RMI - Ein Objekt für Alle? Netzwerkprogrammierung 5
G Nachricht von server an alle clients senden Netzwerkprogrammierung 6
L Socket Zwei Computer im gleichen Netwerk ohne Portforwarding ? Netzwerkprogrammierung 12
E Kurze Textnachrichten über einen Server von meinem Handy auf den Computer laden. Netzwerkprogrammierung 9
I Interne Computer Kommunikation Netzwerkprogrammierung 6
A Computer über Internet verbinden Netzwerkprogrammierung 12
P Auf Computer im LAN zugreifen Netzwerkprogrammierung 15
M SocketError bei Aufruf eines SOAP-Servers Netzwerkprogrammierung 8
G seite nach posten eines html-forms laden Netzwerkprogrammierung 0
J Protokolle innerhalb eines Heimnetzwerks Netzwerkprogrammierung 6
V Kann man mit Hilfe eines Java-Programms den Zugriff auf bestimmte Internetseiten verhinden? Netzwerkprogrammierung 3
N Name eines Attributes aus einem festen String und einer Variablen generieren Netzwerkprogrammierung 5
X Response eines RESTful-Service mit JSON Netzwerkprogrammierung 8
F Neuer Json aus teilen eines vorhandenen Json Netzwerkprogrammierung 0
N Client Identifikation eines Servers Netzwerkprogrammierung 1
R Problem beim Programmieren eines Chatprogramms Netzwerkprogrammierung 5
K Multiplayer eines Spiels Netzwerkprogrammierung 21
K Ansprechen eines Remote Druckers Netzwerkprogrammierung 2
L Erstellen eines Online Multiplayer Apps Netzwerkprogrammierung 10
eLogic Download eines Links Netzwerkprogrammierung 2
U Socket Abhören eines Sockets/Ports in extra Thread Netzwerkprogrammierung 8
2 Schliessen eines Serversockets Netzwerkprogrammierung 2
Hindi93 Abbruch eines Programmes abfangen Netzwerkprogrammierung 8
1 SSH-Kommunikation - Ende eines Streams nicht erkenntlich Netzwerkprogrammierung 2
N Senden eines Arrays Netzwerkprogrammierung 6
U Name eines Netzlaufwerks ermitteln Netzwerkprogrammierung 5
L Body eines http Request auslesen Netzwerkprogrammierung 2
K Ende eines HTTP Response/Request Netzwerkprogrammierung 6
aze Tcp Verkehr eines Applets simulieren Netzwerkprogrammierung 10
J Socket Erreichbarkeit eines Java Servers (Socket-Lösung) über das Internet Netzwerkprogrammierung 3
M Socket Leistungsfähigkeit eines xSocketservers, wieviele Verbindungen max? Netzwerkprogrammierung 4
clupus Exception beim Schließen eines Sockets Netzwerkprogrammierung 6
cowabunga1984 Transferierte Datenmenge eines SOAP Clients (JAX-WS) anzeigen Netzwerkprogrammierung 2
K TrafficClass eines UDP Pakets kommt beim Empfänger nicht an Netzwerkprogrammierung 5
musiKk Problem bei bidirektionaler Nutzung eines Socket Netzwerkprogrammierung 2
J Machbarkeit eines Bluetooth-Servers? Netzwerkprogrammierung 2
S Realisierung eines Netzwerkcodes für ein Strategiespiel Netzwerkprogrammierung 7
K "Ende eines Sockets" Netzwerkprogrammierung 9
P problem beim schließen eines Streams Netzwerkprogrammierung 6
K Mit Java-MailAPI dir Verfügbarkeit eines SMTP-Servers prüfen Netzwerkprogrammierung 4
J while-Schleife / Abbruchbed. beim Einlesen eines Streams Netzwerkprogrammierung 4
U Ende eines Inputstreams ermitteln Netzwerkprogrammierung 3
J Länge eines Streams Netzwerkprogrammierung 4
T Timeout eines KSOAP-Calls Netzwerkprogrammierung 5
G Info eines Webseites kopieren Netzwerkprogrammierung 16
J Antwort eines Soaprequests parsen mittels org.apache.soap Netzwerkprogrammierung 2
E Möglichkeit zum Timeout eines Process Netzwerkprogrammierung 7
T Erstellung eines Proxy Netzwerkprogrammierung 11
T Pfad eines Servlets rausfinden Netzwerkprogrammierung 2
O Einbinden eines java-servers Netzwerkprogrammierung 9
C Übergabe eines Datensatzes (Übergabestruktur) Netzwerkprogrammierung 12
G Verzeichnis eines Rechners übers Netzwerk auslesen Netzwerkprogrammierung 5
B Problem mit der Ausgabe eines Strings an SocketOut Netzwerkprogrammierung 4

Ähnliche Java Themen

Neue Themen


Oben