# IP Adressen im Lokalen Netzwerk Scannen



## agent47 (11. Apr 2010)

Ich brauche eine Funktion die mir die IP-Adressen aller im lokalen Subnetz befindlichen Rechner mit IP und Hostname ermittelt. Ich habe genau genommen schon eine lößung gefunden allerdings ist diese extrem langsam und für den praktischen Einsatz damit unbrauchbar, da ein voller durchlauf ca. 2 Stunden dauert.


```
new Thread() {
						
						@Override
						public void run() {
							
							boolean found = false;
							DefaultListModel lm = new DefaultListModel();
							l.setModel(lm);
							byte[] b = {(byte)192, (byte)168, 0, 0};
							for(int i = 0; i < 256; i++) {
								b[2] = (byte)i;
								for(int j = 0; j < 256; j++) {
									b[3] = (byte)j;
									try {
										InetAddress addr = InetAddress.getByAddress(b);
										if(!addr.getHostName().trim().equalsIgnoreCase(addr.getHostAddress().trim())) {
											lm.addElement("Host: " + addr.getHostName() + " Adresse: " + addr.getHostAddress());
										} else {
											continue;
										}
										found = true;
									} catch (UnknownHostException e1) {
										continue;
									}
								}
								
							}
							if(found == false) {
								lm.addElement("Keine Adressen gefunden");
							}
							
						}
					
					}.start();
```

Ich lasse eben einfach alle Adressen durchsuchen und schaue ob ein Hostname aufgelößt werden konnte aber das ist wie gesagt keine gute lößung, nur hab ich auch keinen besseren ansatz. Zum Testen wird das ergebnis vorerst lediglich in eine JList geschriben in der später auch alle vergbenen Adressen auswählbar sein sollen.


----------



## HoaX (11. Apr 2010)

Eine 100% Lösung gibt es dafür nicht, aber das Thema gabs hier eigentlich schon oft genug.

Wozu brauchst du die denn? Dann kann man die passendste Methode auswählen.


----------



## agent47 (11. Apr 2010)

Hab schon gegoogelt und hier im Forum gesucht aber keine wirklich zufriedenstellende lößung gefunden. Vorerst ist das rein informell, später könnten aber auch funktionen hinzukommen die Daten weiter zu verarbeiten. Wenn von jeder belegten Adresse ein InetAdress Objekt entsteht ist das vollkommen ausreichend.


----------



## Empire Phoenix (11. Apr 2010)

Also denke man kann das ca. factor hostadressenanzahl beschleunigen, ich gehe mal davon aus das die meiste Zeit in einer blockierenden Function beim wartena uf den Timout verbracht wird?
Starte alle abfragen gleichzeitig, in jeweils einem einzelnen Thread.

Ist bestimmt keine saubere Lösung, aber könnte gut genug funktionieren um erstmal benutzt zu werden.

Alternativ könntest du per Processbuilder auf ping/ect zurückgreifen, oder dir per JNI/JNA eine C/C++ Lösung dazu wrappen


----------



## agent47 (12. Apr 2010)

Werde mal die variante mit den Threads versuchen, möglicherweiße erreicht das eine bessere Performance. 
An eine native C funktion habe ich auch schon gedacht, da gibt es aber zwei probleme, zum ersten geht damit die Betriebssystem unabhängigkeit dahin und desweiteren kann ich in C++ nur Grundlagen und das ist bei weitem nicht ausreichend für sowas. Zwar ist es nicht zwingend notwendig das es unter nicht Windows OS läuft, kann aber möglicherweiße zu einem späteren zeitpunkt nötig werden.


----------



## HoaX (12. Apr 2010)

Wie gesagt gibt es eh keine Möglichkeit garantiert alle Host zu finden. Wozu brauchst du die denn alle? Evtl gibt es eine geeignetere Lösung für das Problem.


----------



## agent47 (12. Apr 2010)

Wenn ich das ganze mit Threads mache und vor jedem neustart ca. 8ms warten lasse funtioniert es und such in etwa 8 Minuten, aber ziel ist eher eine Minute. Lasse ich alle hintereinander ohne Wartezeit starten kommt sehr schnell eine OutOfMemoryException.
Wie schon gesagt erstmal sind nur die Information wichtig welche Adressen belegt sind, später könnte es zum Beispiel sein das dann auf den belegten nach bestimmten Diensten wie Webserver oder ähnliches gesucht wird.


----------



## Empire Phoenix (12. Apr 2010)

Naja 8 minuten ist schonmal besser als 2 stunden ^^., erhöhe doch den heap space dann haste auch kein outofmemory


----------

