# Alle Computer eines Netzwerkes finden



## CaptnCAPSLOCK (23. Jan 2011)

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 (23. Jan 2011)

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.


----------



## CaptnCAPSLOCK (23. Jan 2011)

Nein die Möglichkeit besteht nicht, das Tool sollte möglich unabhängig sein und auch in verschiedenen Netzen funktionieren.


----------



## Gast2 (23. Jan 2011)

CaptnCAPSLOCK hat gesagt.:


> 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


----------



## CaptnCAPSLOCK (23. Jan 2011)

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 (23. Jan 2011)

Je nachdem, wie viel oder wenig Java erlaubt ist (in meinem Fall wohl eher weniger ): 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


----------



## CaptnCAPSLOCK (24. Jan 2011)

wollte es möglichst selbst machen 

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 (24. Jan 2011)

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.


----------



## CaptnCAPSLOCK (24. Jan 2011)

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


----------



## maki (24. Jan 2011)

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


----------



## Grey_M (24. Jan 2011)

> 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


```
Map m = Collections.synchronizedMap(new HashMap(...));
```

... (Gibt genug synchronisierte Collections)


----------



## maki (24. Jan 2011)

Weil auch wartende Threads ressourcen belegen oder gar blockieren, weniger ist oft mehr.


----------



## CaptnCAPSLOCK (24. Jan 2011)

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 (24. Jan 2011)

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


----------



## CaptnCAPSLOCK (24. Jan 2011)

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


----------



## Grey_M (24. Jan 2011)

> 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


Na ja... Eine Division, ein Parameter und eine For-Schleife mehr.


----------



## CaptnCAPSLOCK (24. Jan 2011)

Grey_M hat gesagt.:


> Na ja... Eine Division, ein Parameter und eine For-Schleife mehr.



so einfach is es glaub ich nicht, zurzeit kann er auch netzübergreifend suchen, d.h. z.B von 10.0.0.1 bis 10.7.28.114. Das würd ich gern bei behalten


----------



## CaptnCAPSLOCK (25. Jan 2011)

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 
Nur dann bringt der Scheduler schon 50% CPU Auslastung...


----------



## CaptnCAPSLOCK (26. Jan 2011)

Vergleich Klasse C-Netz:
   10 Threads => 52sec
   100 Threads => 6,2sec
   200 Threads => 3,9sec

und findet alles


----------



## Andi_CH (26. Jan 2011)

Grey_M hat gesagt.:


> Könntest du dann bitte dein Ergebnis posten.



Meine Worte ;-) Wäre sehr interessant für einige von uns.


----------



## Grey_M (26. Jan 2011)

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.


----------



## Gast2 (26. Jan 2011)

CaptnCAPSLOCK hat gesagt.:


> und findet alles



hast Du ein komplettes /24 Netz aufgebaut - mit 253 Rechnern? ... glaube wohl nicht ... damit sind die Werte nicht sehr Aussagekräftig

hand, mogel


----------



## HoaX (26. Jan 2011)

Grey_M hat gesagt.:


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


----------



## CaptnCAPSLOCK (26. Jan 2011)

mogel hat gesagt.:


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


----------



## Gast2 (26. Jan 2011)

CaptnCAPSLOCK hat gesagt.:


> erstens Mal hat ein /24 Netz 254 Rechner


253 Rechner + 1 Gateway 



> 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


----------



## CaptnCAPSLOCK (26. Jan 2011)

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

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.


----------



## despikyxd (12. Feb 2011)

maki hat gesagt.:


> 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


----------



## despikyxd (12. Feb 2011)

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


----------



## CaptnCAPSLOCK (12. Feb 2011)

despikyxd hat gesagt.:


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



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


----------



## despikyxd (12. Feb 2011)

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 ^^


----------



## maki (12. Feb 2011)

> soll ich dir das jetzt wirklich erklären ?


Nö.



> mich kümmert es wenig das du MOD bist ...


Interessant dass du es erwähnst.

Der Rest ist mir zu lang zu lesen...:gaen:


----------



## Gast2 (12. Feb 2011)

maki hat gesagt.:


> 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 

hand, mogel


----------



## jaavaa (18. Feb 2011)

maki hat gesagt.:


> Der Rest ist mir zu lang zu lesen...:gaen:



Und sowas wir MOD -.-

Mfg


----------

