# IP-Adressen rausfischen



## SkonroX (2. Dez 2010)

Hallo,
ich habe ein programm geschrieben, mit welchem ich alle vergebenen IP-Adressen im Netzwerk auflisten will, was mir jedoch nur bedingt gelingt, unzwar gibt er erstens nicht wie gewünschte alle ping anfragen ein, dazu noch eine menge doppelt und nicht bis zum ende..
bin für jede Hilfe dankbar..
Code:

```
package LAN_SCAN;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;
public class scan
{
	/* (c) by SkonroX */
	public static Object[] e;
	public static String hostip = null;		
	public static int port = 445;
	public static Socket socket;
	public static InetAddress host;
	public static File file = new File( System.getProperty( "user.home" ) + "/desktop/IP-Liste.txt" );
	public static File file2 = new File( System.getProperty( "user.home" ) + "/desktop/IP-Liste-Temp.txt" );
	public static long roundTripTime;
	public static BufferedWriter bw = null;
	public static BufferedWriter bw2 = null;
	public static int zaehler;
	private static scaning[] sc = null;
	public static String klasse = "c";
	public static void main( String[] args ) 
	{		
		if( klasse == "a" )
		{
			try { classa(); }
			catch ( IOException e ) { e.printStackTrace(); }
		}
		if( klasse == "b" )
		{
			try { classb(); }
			catch ( IOException e ) { e.printStackTrace(); }
		}
		if( klasse == "c" )
		{
			try { classc(); } 
			catch ( IOException e ) { e.printStackTrace(); } 
			catch ( InterruptedException e ) { e.printStackTrace(); }
		}
		if( klasse != "a" && klasse != "b" && klasse != "c" ) { System.out.println( "Ungültige Eingabe!" ); }
	}
	private static void classc() throws IOException, InterruptedException
	{
		zaehler = 0;
		int j = 0;
		sc = new scaning[ ( 256 * 256) + 1 ];
   	  	bw = new BufferedWriter( new FileWriter( file ) );
   	  	bw2 = new BufferedWriter( new FileWriter( file2 ) );
   	  	bw.write( "IP-Adress finder for network class C (c) by SkonroX" );
   	  	bw2.write( "IP-Adress with failure connection:" );
	  	bw.newLine();
	  	bw2.newLine();
	  	bw.flush();
	  	bw2.flush();
		for( int i = 0; i < 256; i++ )
		{
			hostip = "192.168." + j + "." + i;
			/*if( zaehler == 500 ) 
			{ 
				if( !sc[ 499 ].isAlive() ) { zaehler = 0; i--; }
				else { i--; }
			}*/
			//if( zaehler != 500 ) 
			//{
				sc[ zaehler ] = new scaning();
				sc[ zaehler ].main( hostip, port );
				sc[ zaehler ].start();
				zaehler++; 
				if( i == 255 && j < 256 ) { j++; i = 0; }
				if( j > 255) { break; }
			//}
		}
		bw.close();
		bw2.close();
	}
	private static void classb() throws IOException
	{
		int j = 0, k = 0, zaehler = 0;
		scaning[] sc = new scaning[ ( ( 255 * 255 ) * 255 ) + 1 ];
		bw = new BufferedWriter( new FileWriter( file ) );
   	  	bw.write( "IP-Adressen finder for network class B (c) by SkonroX" );
	  	bw.newLine();
	  	bw.flush();
		for( int i = 0; i < 256; i++ )
		{
			hostip = "172." + k + "." + j + "." + i;
			sc[ zaehler ] = new scaning();
			sc[ zaehler ].start();
			zaehler++;
			if( i == 255 ) { j++; i = 0; }
			if( j == 255 && i == 255 ) { k++; i = 0; j = 0; }
			if( j > 255 || k > 255) { break; }
		}
		bw.close();
	}
	private static void classa() throws IOException
	{
		int j = 0, k = 0, l = 0, zaehler = 0;
		scaning[] sc = new scaning[ ( ( ( 255 * 255 ) * 255 ) * 255 ) + 1 ];
		bw = new BufferedWriter( new FileWriter( file ) );
   	  	bw.write( "IP-Adressen finder for network class A (c) by SkonroX" );
	  	bw.newLine();
	  	bw.flush();
		for( int i = 0; i < 256; i++ )
		{
			hostip = l + "." + k + "." + j + "." + i;
			sc[ zaehler ] = new scaning();
			sc[ zaehler ].start();
			zaehler++;
			if( i == 255 ) { j++; i = 0; }
			if( j == 255 && i == 255 ) { k++; i = 0; j = 0; }
			if( k == 255 && j == 255 && i == 255 ) { l++; i = 0; j = 0; k = 0; }
			if( j > 255 || k > 255 || l > 255) { break; }
		}
		bw.close();
	}
}
```

Hier der Nebenthread:

```
package LAN_SCAN;
import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;
public class scaning extends Thread
{
	private static Object[] e;
	private static long roundTripTime;
	private static InetAddress host;
	private static Socket socket;
	private static String wert1;
	private static int wert2;
	public static void ping( String hostip, int string )
    {
	   try
       {
           roundTripTime = System.nanoTime();
           host = InetAddress.getByName( hostip );
           socket = new Socket( host, string );
           roundTripTime = ( System.nanoTime() - roundTripTime ) / 1000000L;
           socket.close();
           e = new Object[]{ host.getHostAddress(), host.getHostName(), roundTripTime };
           System.out.println( "HostIP: " + e[ 0 ] + " " + "HostName: " + e[ 1 ] + " " + "MilliSeconds: " + e[ 2 ] );
           scan.bw.write( "HostIP: " + e[ 0 ] + " " + "HostName: " + e[ 1 ] + " " + "MilliSeconds: " + e[ 2 ] );
           scan.bw.newLine();
           scan.bw.flush();
       }
       catch( Exception e )
       {
       	   System.out.println( e.getMessage() + " when ping IP: " + hostip );
       	   try 
       	   {
       		   scan.bw2.write( e.getMessage() + " when ping IP: " + hostip );
       		   scan.bw2.newLine();
       		   scan.bw2.flush();
       	   } 
       	   catch (IOException e1) { e1.printStackTrace(); } 
       }
    }
	public void run()
	{
		ping( wert1, wert2 );
	}
	public void main( String a, int x )
	{
		wert1 = a;
		wert2 = x;
		return;
	}
}
```


----------



## XHelp (3. Dez 2010)

Strings werden mit equals vergliechen.
Klassennamen werden groß geschrieben, Packages klein.
Du kannst auch die ganzen (nichtssagenden) funktionen classx zu einer zusammenführen, dann hast du auch nicht so viel Doppelcode.
Aber generell läst sich dein Quelltext so gar nicht gut lesen:
Object[] e; - wozu??? vor allem was ist e??
catch( Exception e ) - zweites e.. hmmm
"int string" - im ernst?
... usw.


----------



## SkonroX (3. Dez 2010)

Also um die groß und kleinschreibung von den beschriftungen mach ich mir keinen kopf, da komm ich so besser klar.. 
dazu kann man Strings auch prima mit == "" vergleichen, geht nur nicht mit character.
Und die ganzen funktionen (Methoden) sind für die verschiedenen netzklassen die es gibt (a, b und c), da natürlich bei die größe wie folgt ist: a > b > c, was bedeutet ich muss bei a jede mögliche IP ausscannen, was natürlich 255^4 ist, und das zusammenzufassen wäre um einiges umständlicher als wie ich es getan habe.
Dazu ist das Object e dafür da, alle wichtigen informationen aus dem nebenthread zu erlangen, durch nur ein Object.
Das zweite e ist nur für das Protokoll welches in eine Datei geschrieben wird und int string hab ich nur genommen weil ich nicht doppelt port vergeben wollte, dazu solange ich mir das merken kann sollte das ja kein problem sein.

mfg


----------



## FArt (3. Dez 2010)

SkonroX hat gesagt.:


> Also um die groß und kleinschreibung von den beschriftungen mach ich mir keinen kopf, da komm ich so besser klar..
> dazu kann man Strings auch prima mit == "" vergleichen, geht nur nicht mit character.
> Und die ganzen funktionen (Methoden) sind für die verschiedenen netzklassen die es gibt (a, b und c), da natürlich bei die größe wie folgt ist: a > b > c, was bedeutet ich muss bei a jede mögliche IP ausscannen, was natürlich 255^4 ist, und das zusammenzufassen wäre um einiges umständlicher als wie ich es getan habe.
> Dazu ist das Object e dafür da, alle wichtigen informationen aus dem nebenthread zu erlangen, durch nur ein Object.
> ...


lol

Schon ein wenig vermessen, oder? Andere sollen Fehler in deinem Code finden, aber du möchtest dich nicht an die allgemein gültigen Konventionen halten weil DU den Müll besser findest? Du behauptest fälschlicherweise, dass man Strings auch mit == vergleichen kann und anstatt den Code sauber zu kommentieren und sinnvolle Variablennamen zu verwenden, lieferst du einen "kurzen Abriss" über die vermeintliche Funktionalität in bester Prosa...

... ich würde sagen: mutig... (eigentlich ist mir ein anderes Wort eingefallen...)


----------



## The_S (3. Dez 2010)

SkonroX hat gesagt.:


> Also um die groß und kleinschreibung von den beschriftungen mach ich mir keinen kopf, da komm ich so besser klar..
> dazu kann man Strings auch prima mit == "" vergleichen, geht nur nicht mit character.
> Und die ganzen funktionen (Methoden) sind für die verschiedenen netzklassen die es gibt (a, b und c), da natürlich bei die größe wie folgt ist: a > b > c, was bedeutet ich muss bei a jede mögliche IP ausscannen, was natürlich 255^4 ist, und das zusammenzufassen wäre um einiges umständlicher als wie ich es getan habe.
> Dazu ist das Object e dafür da, alle wichtigen informationen aus dem nebenthread zu erlangen, durch nur ein Object.
> ...



*ymmd* :lol::toll::applaus:

Sorry für Spam, aber das is einfach zu geil. Ansonsten FullAck @Fart


----------



## HoaX (3. Dez 2010)

Man sollte mal einen "Best of" Thread anlegen und jährlich den "Besten" voten lassen


----------



## ARadauer (3. Dez 2010)

> dazu kann man Strings auch prima mit == "" vergleichen


nein
== -> ist es das gleiche
equals -> sind sie gleich


----------



## FArt (3. Dez 2010)

Na ja, wenn man ganz ehrlich ist kann man Strings schon "prima" mit == vergleichen... kommt halt drauf an, was man als Ergebnis erwartet...


----------



## Andi_CH (3. Dez 2010)

SkonroX hat gesagt.:


> Also um die groß und kleinschreibung von den beschriftungen mach ich mir keinen kopf, da komm ich so besser klar..


Wo  nichts ist, kann man auch keine Schmerzen kriegen ...



SkonroX hat gesagt.:


> dazu kann man Strings auch prima mit == "" vergleichen, geht nur nicht mit character.


Wie vergleicht man denn so ganz ohne Character? Äh wollte fragen: Wie vergleicht man den zwei character?



SkonroX hat gesagt.:


> Dazu ist das Object e dafür da, alle wichtigen informationen aus dem Nebenthread zu erlangen, durch nur ein Object.


Hm, seit wann ist eine Array ein Objekt? Mach doch eine Klasse mit 3 Members wenn meinst damit etwas zu sparen ;-)



SkonroX hat gesagt.:


> ... sollte das ja kein problem sein.


Irgendwo hab ich mal von einem weisen, erfahrenen Mann gelesen der gesagt hat, dass 99% aller Probleme im Zusammenhang mit Computern zwischen der Tastatur und der Lehne des Bürosessels zu suchen seien ...


mfg[/QUOTE]
(spannender Name  )

Tschüss[/QUOTE]
Andi


----------



## Gast2 (3. Dez 2010)

Andi_CH hat gesagt.:


> Hm, seit wann ist eine Array ein Objekt? Mach doch eine Klasse mit 3 Members wenn meinst damit etwas zu sparen ;-)
> Andi



In Java immer schon gewesen... Aber ich weiß worauf du hinauswillst 


```
int[] array = new int[]{1,2,3,4};
System.out.println(array.getClass().getSuperclass()); --> java.lang.Object
System.out.println(array.getClass().getComponentType()); --> int
```


----------



## Andi_CH (3. Dez 2010)

Ja, muss so sein, denn sonst würde das Ding ja nicht in den array passen ;-)
Es macht einfach keinen Sinn zwei Strings und einen int in einem Array zu speichern, nur um sie auf der nächsten Zeile wieder zu lesen :noe:

Den habe ich erst jetzt entdeckt  Extrem kreative Namenswahl 
ein int der string heisst :lol:

```
private static void ping( String hostip, int string )
```

Ach ja, der erste ping geht an die die IP 0.0.0.0 - ob es die wohl gibt?


----------



## SkonroX (3. Dez 2010)

Irgendwie hab ich euch ja doch lieb xD 
aber nunja habs jetzt etwas umgeschrieben, poste es dann nochmal, sorry


----------



## Andi_CH (3. Dez 2010)

Wir dich auch - hmhm - Spannend ist auch der name "ping" der dann gar kein ping macht ;-)


----------



## SkonroX (3. Dez 2010)

Soooo... neuer Code:

```
package LAN_SCAN;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
public class scan
{
	/* (c) by SkonroX */
	public static String hostip = null;		
	public static File file = new File( System.getProperty( "user.home" ) + "/desktop/IP-Liste.txt" );
	public static File file2 = new File( System.getProperty( "user.home" ) + "/desktop/IP-Liste-Temp.txt" );
	public static BufferedWriter bw = null;
	public static BufferedWriter bw2 = null;
	public static int zaehler;
	private static scaning[] sc = null;
	public static String klasse = "c";		//Auswahl der Netzwerkklasse (A/B/C)
	public static void main( String[] args ) 
	{		
		if( klasse == "a" )
		{
			try { classa(); }
			catch ( IOException e ) { e.printStackTrace(); }
		}
		if( klasse == "b" )
		{
			try { classb(); }
			catch ( IOException e ) { e.printStackTrace(); }
		}
		if( klasse == "c" )
		{
			try { classc(); } 
			catch ( IOException e ) { e.printStackTrace(); } 
			catch ( InterruptedException e ) { e.printStackTrace(); }
		}
		if( klasse != "a" && klasse != "b" && klasse != "c" ) { System.out.println( "Ungültige Eingabe!" ); }
	}
	private static void classc() throws IOException, InterruptedException	//Netzwerkklasse = C
	{
		zaehler = 0;
		int j = 0;
		sc = new scaning[ ( 256 * 256 ) + 1 ];		//Versucht soviele Threads aufzumachen, wie nötig sind für jeden Ping :P
   	  	bw = new BufferedWriter( new FileWriter( file ) );
   	  	bw2 = new BufferedWriter( new FileWriter( file2 ) );
   	  	bw.write( "IP-Adress finder for network class C (c) by SkonroX" );
   	  	bw2.write( "IP-Adress with failure connection:" );
	  	bw.newLine();
	  	bw2.newLine();
	  	bw.flush();
	  	bw2.flush();
		for( int i = 0; i < 256; i++ )		//Durchläuft alle IP-Adressen, von 192.168.0.0 bis 192.168.255.255
		{
			hostip = "192.168." + j + "." + i;
			sc[ zaehler ] = new scaning();
			sc[ zaehler ].start();
			zaehler++; 
			if( i == 255 && j < 256 ) { j++; i = 0; }
			if( j > 255) { break; }
		}
		bw.close();
		bw2.close();
	}
	private static void classb() throws IOException		//B und A noch nicht weitergemacht :)
	{
		int j = 0, k = 0, zaehler = 0;
		scaning[] sc = new scaning[ ( ( 255 * 255 ) * 255 ) + 1 ];
		bw = new BufferedWriter( new FileWriter( file ) );
   	  	bw.write( "IP-Adressen finder for network class B (c) by SkonroX" );
	  	bw.newLine();
	  	bw.flush();
		for( int i = 0; i < 256; i++ )
		{
			hostip = "172." + k + "." + j + "." + i;
			sc[ zaehler ] = new scaning();
			sc[ zaehler ].start();
			zaehler++;
			if( i == 255 ) { j++; i = 0; }
			if( j == 255 && i == 255 ) { k++; i = 0; j = 0; }
			if( j > 255 || k > 255) { break; }
		}
		bw.close();
	}
	private static void classa() throws IOException
	{
		int j = 0, k = 0, l = 0, zaehler = 0;
		scaning[] sc = new scaning[ ( ( ( 255 * 255 ) * 255 ) * 255 ) + 1 ];
		bw = new BufferedWriter( new FileWriter( file ) );
   	  	bw.write( "IP-Adressen finder for network class A (c) by SkonroX" );
	  	bw.newLine();
	  	bw.flush();
		for( int i = 0; i < 256; i++ )
		{
			hostip = l + "." + k + "." + j + "." + i;
			sc[ zaehler ] = new scaning();
			sc[ zaehler ].start();
			zaehler++;
			if( i == 255 ) { j++; i = 0; }
			if( j == 255 && i == 255 ) { k++; i = 0; j = 0; }
			if( k == 255 && j == 255 && i == 255 ) { l++; i = 0; j = 0; k = 0; }
			if( j > 255 || k > 255 || l > 255) { break; }
		}
		bw.close();
	}
}
```
Und die andere Klasse:

```
package LAN_SCAN;
import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;
public class scaning extends Thread
{
	private static String o_neu;
	private static long roundTripTime;
	private static InetAddress host;
	private static Socket socket;
	private static String ip_neu;
	public static boolean ping( String ip )	//Methode welche die Zeit zum verbinden mit dem angegebenen socket anzeigt, falls möglich
    {
	   try
       {
           roundTripTime = System.nanoTime();
           host = InetAddress.getByName( ip );
           socket = new Socket( host, 445 );
           roundTripTime = ( System.nanoTime() - roundTripTime ) / 1000000L;
           socket.close();
           return true;
       }
       catch( Exception e )
       {
    	   o_neu = e.getMessage();
    	   ip_neu = ip;
       	   return false;
       }
    }
	public void run()
	{
		if( ping( scan.hostip ) == true)		//falls verbindung zum socket möglich war
		{
			try 	//Protokoll der verbindungsversuche, eine Datei für erfolgreiche verbindung, zweite für nicht erfolgreiche
			{ 
				scan.bw.write( "HostIP: " + host.getHostAddress() + " " + "HostName: " + host.getHostName() + " " + "MilliSeconds: " + roundTripTime );
				scan.bw.newLine();
				scan.bw.flush();
			} 
			catch (IOException e1) { e1.printStackTrace(); }
		}
		else
		{
			try 
			{
				scan.bw2.write( o_neu + " when IP is: " + ip_neu );
				scan.bw2.newLine();
				scan.bw2.flush();
			} 
			catch ( IOException e1 ) { e1.printStackTrace(); }
		}
	}
}
```


----------



## maki (3. Dez 2010)

Deine Stringvergleiche sind immer noch falsch, funktinieren im Moment eher zufällig, sobald klasse in einem anderen Packet deklariert/initialisiert wird, gehen sie schief.
Deine Klasse scan verstösst immer noch gegen die Java Code Konventionen, ausserdem schliesst du deine BufferedWriter nicht richtig, da fehlt richtiges Exceptionhandling.
Die statischen Member von scan sind Public, böses foul.

Läuft der Code den wenigstens?


----------



## SkonroX (3. Dez 2010)

Hmm.. also die Stringvergleiche funktionieren einwandfrei..
und wie verstößt scan gegen die java code konventionen?
dazu sind die bufferedwriter am ende der for-schleife closed.
wie meinst du das mit statische member von scan sind public? macht doch keinen unterschied wenn ich die private mache, oder doch?!
laufen tut der code nur bedingt, unzwar gibt das programm nicht alles aus, und dazu haufenweise doppelt.

mfg


----------



## XHelp (3. Dez 2010)

Klassennamen beginnen mit eine Großbuchstaben.
Hast du dir schon mal die Mühe gemacht ein paar Debugausgaben zu setzen um zu verstehen, warum es so passiert?


----------



## SkonroX (3. Dez 2010)

ja, ich habe bevor ein neuer thread geöffnet wird mal alle ip adressen in eine txt geschrieben, und dort wurde alles richtig angegeben

mfg


----------



## FArt (3. Dez 2010)

Zu den Strings:
Java String comparison FAQ: How to compare Java Strings | Java String compare tutorial | devdaily.com


----------



## XHelp (3. Dez 2010)

SkonroX hat gesagt.:


> ja, ich habe bevor ein neuer thread geöffnet wird mal alle ip adressen in eine txt geschrieben, und dort wurde alles richtig angegeben



Dann wird der Fehler vermutlich weiter liegen? Also weiter debugen.


----------



## Andi_CH (3. Dez 2010)

Es könnte ja sein, dass einige Mitleser unnötig verwirrt sind:

Namen endlich mal richtig Stellen
Mit einem Loop lassen sich unmöglich alle Kombinationen erreichen.
Variable scan ist immer noch nicht definiert -> hostip gleich mit dem Konstruktor übergeben ist besser!
Statische Variablen und funktinoen in einem Objekt dürften auch einige interessante Nebeneffekte haben.


----------



## XHelp (3. Dez 2010)

Andi_CH hat gesagt.:


> Mit einem Loop lassen sich unmöglich alle Kombinationen erreichen.



Warum nicht?


----------



## Andi_CH (3. Dez 2010)

Stimmt, warum nicht - ich hab den magischen Trick i = 0 schlicht übersehen
Mir graust! :wuerg:

Ich glaub ich wäre mit Pauken und Trompeten von der Schule verwiesen worden


----------



## ARadauer (3. Dez 2010)

> Hmm.. also die Stringvergleiche funktionieren einwandfrei..


zufällig da du 
public static String klasse = "c";   
oben definiert hast, jetzt cached java den String und es ist das selbe Objekte... diese klasse wird ja später mal irgendwo eingegeben (vermute ich), dann klappsts nicht mehr!

Also Strings vergleicht man mit equals! Aus!

das kotzen smiley.. ist zwar einwenig übertrieben aber naja...


```
for( int i = 0; i < 256; i++ )      //Durchläuft alle IP-Adressen, von 192.168.0.0 bis 192.168.255.255
        {
            hostip = "192.168." + j + "." + i;
            ....
            if( i == 255 && j < 256 ) { j++; i = 0; }
            if( j > 255) { break; }
            ...
        }
```
das ist schon arg verwirrend... kannst nicht mitten drinnen in einer schleife die zähler variable ändern... das kann man in schwer nachvollziehen...
warum nicht so?


```
for(int i = 0; i < 256; i++){
    		for(int j = 0; j < 256; j++){
    			 hostip = "192.168." + j + "." + i;
    			 ..
    		}
    	}
```


----------



## ARadauer (3. Dez 2010)

hier deine classa schleife


```
for( int i = 0; i < 256; i++ )
        {
            hostip = l + "." + k + "." + j + "." + i;
            System.out.println(hostip);
            if( i == 255 ) { j++; i = 0; }
            if( j == 255 && i == 255 ) { k++; i = 0; j = 0; }
            if( k == 255 && j == 255 && i == 255 ) { l++; i = 0; j = 0; k = 0; }
            if( j > 255 || k > 255 || l > 255) { break; }
        }
```
man kann es sich auch scher machen ;-) was soll das machen?
von 1.0.0.0 bis 1.255.255.255 zählen?


```
for (int i = 0; i < 256; i++) {
			for (int j = 0; j < 256; j++) {
				for (int k = 0; k < 256; k++) {
					hostip = 1 + "." + i + "." + j + "." + k;
					System.out.println(hostip);
				}
			}
		}
```
besser?


----------



## HoaX (3. Dez 2010)

```
for(int i=0; i<256*256*256; i++) {
			int x4 = i % 256;
			int x3 = (i / 256) % 256;
			int x2 = (i / 256 / 256);
			
			System.out.println("1." + x2 + "." + x3 + "." + x4);
		}
```
Wenn man wirklich nur eine Schleife haben möchte.


----------



## SkonroX (3. Dez 2010)

also das mit den schleifen ist mein geringstes problem, das funktioniert so oder so, und so fand ich es eben einfacher ;P
Hab jetzt nochmal am code gebastelt:


```
package LAN_SCAN;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
public class Scan
{
	/* (c) by SkonroX */
	public static String hostip = null;		
	public static File file = new File( System.getProperty( "user.home" ) + "/desktop/IP-Liste.txt" );
	public static File file2 = new File( System.getProperty( "user.home" ) + "/desktop/IP-Liste-Temp.txt" );
	public static BufferedWriter bw = null;
	public static BufferedWriter bw2 = null;
	private static int threads = 2000;
	public static int zaehler;
	private static Scaning[] sc = null;
	public static String klasse = "c";		//Auswahl der Netzwerkklasse (A/B/C)
	public static void main( String[] args ) 
	{		
		if( klasse.equals( "a" ) )
		{
			try { classa(); }
			catch ( IOException e ) { e.printStackTrace(); }
		}
		if( klasse.equals( "b" ) )
		{
			try { classb(); }
			catch ( IOException e ) { e.printStackTrace(); }
		}
		if( klasse.equals( "c" ) )
		{
			try { classc(); } 
			catch ( IOException e ) { e.printStackTrace(); } 
			catch ( InterruptedException e ) { e.printStackTrace(); }
		}
		if( klasse.equals( "a" ) && klasse.equals( "b" ) && klasse.equals( "c" ) ) { System.out.println( "Ungültige Eingabe!" ); }
	}
	private static void classc() throws IOException, InterruptedException	//Netzwerkklasse = C
	{
		zaehler = 0;
		int j = 0;
		sc = new Scaning[ threads ];		//Versucht soviele Threads aufzumachen, wie nötig sind für jeden Ping :P
   	  	bw = new BufferedWriter( new FileWriter( file ) );
   	  	bw2 = new BufferedWriter( new FileWriter( file2 ) );
   	  	bw.write( "IP-Adress finder for network class C (c) by SkonroX" );
   	  	bw2.write( "IP-Adress with failure connection:" );
	  	bw.newLine();
	  	bw2.newLine();
	  	bw.flush();
	  	bw2.flush();
		for( int i = 0; i < 256; i++ )		//Durchläuft alle IP-Adressen, von 192.168.0.0 bis 192.168.255.255
		{
			if( zaehler == threads )
			{
				for( int k = 0; k < threads; k++ )
				{
					if( sc[ k ].isAlive() )
					{
						k = 0;
					}
				}
				zaehler = 0;
				i--;
			}
			else
			{
				hostip = "192.168." + j + "." + i;
				sc[ zaehler ] = new Scaning();
				sc[ zaehler ].setip( hostip );
				sc[ zaehler ].start();
				zaehler++; 
				if( i == 255 && j < 256 ) { j++; i = 0; }
				if( j > 255) { break; }
			}
		}
		bw.close();
		bw2.close();
	}
	private static void classb() throws IOException		//B und A noch nicht weitergemacht :)
	{
		int j = 0, k = 0, zaehler = 0;
		Scaning[] sc = new Scaning[ ( ( 255 * 255 ) * 255 ) + 1 ];
		bw = new BufferedWriter( new FileWriter( file ) );
   	  	bw.write( "IP-Adressen finder for network class B (c) by SkonroX" );
	  	bw.newLine();
	  	bw.flush();
		for( int i = 0; i < 256; i++ )
		{
			hostip = "172." + k + "." + j + "." + i;
			sc[ zaehler ] = new Scaning();
			sc[ zaehler ].start();
			zaehler++;
			if( i == 255 ) { j++; i = 0; }
			if( j == 255 && i == 255 ) { k++; i = 0; j = 0; }
			if( j > 255 || k > 255) { break; }
		}
		bw.close();
	}
	private static void classa() throws IOException
	{
		int j = 0, k = 0, l = 0, zaehler = 0;
		Scaning[] sc = new Scaning[ ( ( ( 255 * 255 ) * 255 ) * 255 ) + 1 ];
		bw = new BufferedWriter( new FileWriter( file ) );
   	  	bw.write( "IP-Adressen finder for network class A (c) by SkonroX" );
	  	bw.newLine();
	  	bw.flush();
		for( int i = 0; i < 256; i++ )
		{
			hostip = l + "." + k + "." + j + "." + i;
			sc[ zaehler ] = new Scaning();
			sc[ zaehler ].start();
			zaehler++;
			if( i == 255 ) { j++; i = 0; }
			if( j == 255 && i == 255 ) { k++; i = 0; j = 0; }
			if( k == 255 && j == 255 && i == 255 ) { l++; i = 0; j = 0; k = 0; }
			if( j > 255 || k > 255 || l > 255) { break; }
		}
		bw.close();
	}
}
```

Nebenklasse:


```
package LAN_SCAN;
import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;
public class Scaning extends Thread
{
	private static String o_neu;
	private static long roundTripTime;
	private static InetAddress host;
	private static String ip_alt;
	private static Socket socket;
	private static String ip_this;
	public static boolean ping( String ip )	//Methode welche die Zeit zum verbinden mit dem angegebenen socket anzeigt, falls möglich
    {
	   try
       {
           roundTripTime = System.nanoTime();
           host = InetAddress.getByName( ip );
           socket = new Socket( host, 445 );
           roundTripTime = ( System.nanoTime() - roundTripTime ) / 1000000L;
           socket.close();
           return true;
       }
       catch( Exception e )
       {
    	   o_neu = e.getMessage();
    	   ip_this = ip;
       	   return false;
       }
    }
	public void setip( String ip_eing )
	{
		ip_alt = ip_eing;
	}
	public void run()
	{
		if( ping( ip_alt ) == true)		//falls verbindung zum socket möglich war
		{
			try 	//Protokoll der verbindungsversuche, eine Datei für erfolgreiche verbindung, zweite für nicht erfolgreiche
			{ 
				Scan.bw.write( "HostIP: " + host.getHostAddress() + " " + "HostName: " + host.getHostName() + " " + "MilliSeconds: " + roundTripTime );
				Scan.bw.newLine();
				Scan.bw.flush();
			} 
			catch (IOException e1) { e1.printStackTrace(); }
		}
		else
		{
			try 
			{
				Scan.bw2.write( o_neu + " when IP is: " + ip_this );
				Scan.bw2.newLine();
				Scan.bw2.flush();
			} 
			catch ( IOException e1 ) { e1.printStackTrace(); }
		}
	}
}
```

Jedoch spuckt er mir immernoch viele doppelte werte aus und überprüft wird alles bereits mit dem zweiten filewriter, welcher die fehlschläge notiert, dazu wird mein lokaler rechner auch nicht immer gefunden, sondern nur manchmal (192.168.1.80), wobei dieser natürlich jedes mal dabei sein müsste.

mfg


----------



## HoaX (4. Dez 2010)

Also ich kapituliere wegen Beratungsresistenz.


----------



## maki (4. Dez 2010)

SkonroX hat gesagt.:


> Hmm.. also die Stringvergleiche funktionieren einwandfrei..


Aber nur zufällig, weil sie im selben Packet/Klasse deiniert sind, da optimiert der Compiler.
Objekte vergleicht man immer mit equals, Primitive Datentypen und Referenzen mit ==



SkonroX hat gesagt.:


> und wie verstößt scan gegen die java code konventionen?


Klassen groß-; Methoden, Variablen und packages kleinschreiben.
Dazu noch in CamelCaseNotation (Klasse) bzw camelCaseNotation (Methode, Variablen) oder gar kopmplett klein im Falle von packages.



SkonroX hat gesagt.:


> dazu sind die bufferedwriter am ende der for-schleife closed.


Nun, wenn eine Exception beim schliessen des ersten Writers gibt wird der 2. nicht mehr geschlossen.



SkonroX hat gesagt.:


> wie meinst du das mit statische member von scan sind public? macht doch keinen unterschied wenn ich die private mache, oder doch?!


Doch  Aber das hast du ja auch bereits umgesetzt, so wie einige der anderen Punkte.



SkonroX hat gesagt.:


> laufen tut der code nur bedingt, unzwar gibt das programm nicht alles aus, und dazu haufenweise doppelt.


Debuggen & Logausgaben helfen da.


----------



## SkonroX (5. Dez 2010)

also..
Beratungsresistenz kann ich nun wirklich nicht sein, habe nahezu alles geändert was mir vorgeschlagen wurde..
Stringvergleich habe ich bereits mit equals verbessert.
packete habe ich auch jetzt kleingeschrieben, variablen, methoden etc klein.
die writer werden ja nicht nach der exception, sondern nach der schleife geschlossen,
Und ich bräuchte hilfe beim loggen, da ich nicht weiß wie ich die setzen soll, damit das ergebnis auch sinn ergibt, habe sie in der schleife an hostip gebunden, sodass jede hostip, welche eingesetzt wird für die threads gelogt wird, jedoch schien das in ordnung zu sein, jedoch ist das ergebnis dann immernoch das viele ip's doppelt sind und viele einfach fehlen.

mfg


----------



## Bierhumpen (5. Dez 2010)

maki hat gesagt.:


> Aber nur zufällig, weil sie im selben Packet/Klasse deiniert sind, da optimiert der Compiler.


Quatsch ???:L


----------



## maki (5. Dez 2010)

Bierhumpen hat gesagt.:


> Quatsch ???:L


Quatsch ist dein "Kommentar", wenn du eine Frage, stelle sie einfach.


----------



## maki (5. Dez 2010)

> die writer werden ja nicht nach der exception, sondern nach der schleife geschlossen,




```
bw.close();
        bw2.close();
```
Wenn die erste Zeile eine Exception verursacht, wird die 2. nie ausgeführt 
Da helfen entweder geschaltete try/catch Blöcke (hässlich), oder (statische) Utility Methoden.



> Und ich bräuchte hilfe beim loggen, da ich nicht weiß wie ich die setzen soll, damit das ergebnis auch sinn ergibt, habe sie in der schleife an hostip gebunden, sodass jede hostip, welche eingesetzt wird für die threads gelogt wird, jedoch schien das in ordnung zu sein, jedoch ist das ergebnis dann immernoch das viele ip's doppelt sind und viele einfach fehlen.


Nimm doch ertsmal ein System.out.println.
Zum Thema Debuggen: Bei Breakpoints kannst du einstellen, ob nur der eine Trhead angehalten werden soll, oder alle, ersteres ist Default, letzteres heisst "Suspend VM".


----------



## FArt (6. Dez 2010)

maki hat gesagt.:


> ```
> bw.close();
> bw2.close();
> ```
> ...



Ich kenne jetzt nur die sichere Variante mit try-finally. Ich sehe auch nicht, warum das hässlich sein sollte. Kannst du mal ein Beispiel zeigen, wie man das Problem mit statischen Utilitymethoden in den Griff bekommt?


----------



## maki (6. Dez 2010)

"hässlich" deswegen, weil es redundant ist, wenn man mehrere Writer zu schliessen hat.
GWT hat mehrerer solcher Methoden:com.google.gwt.util.tools: Utility.java


----------



## FArt (6. Dez 2010)

maki hat gesagt.:


> "hässlich" deswegen, weil es redundant ist, wenn man mehrere Writer zu schliessen hat.
> GWT hat mehrerer solcher Methoden:com.google.gwt.util.tools: Utility.java



Ach so, also nichts anderes, sieht nur anders aus... lol
Und gerade bei dieser Implementierung sieht man, dass das nicht unbedingt eine gute Idee ist. 

Fallbeispiel:
Das schreiben einer Datei funktioniert noch einwandfrei. Danach wird der Stream mit einem Fehler geschlossen (den man nicht sieht, weil die Exception nicht einmal geloggt wird). An einer ganz anderen Stelle im Code soll wieder auf die Datei zugegriffen werden. Das funktioniert nicht. Fröhliche Fehlersuche.

Der Code sieht nur vermeintlich aufgeräumter aus. Schreiben muss ich keinen Strich mehr, wenn ich die Behandlung direkt vornehme, weil mir die IDE den Block mit der Defaultlösung generiert.... und oft wird diese Defaultlösung noch den aktuellen Bedürfnissen angepasst...


----------



## maki (6. Dez 2010)

Schonkalr FArt, wenn man die mögliche Exception behandeln oder lggen will, ist das nicht die richtige Lösung.

Wenn man die Exception aber sowieso schlucken würde, bietet sich eine statische Utility Methode an.


----------



## Semox (7. Dez 2010)

Hi

Wenn Du ein *nix hast, dann versuche doch mal diese paar Zeilen:


```
#!/bin/bash

for ip in $(seq 1 254)
do
( ping -c 1 -W 1 192.168.1.$ip >/dev/null && echo 192.168.1.$ip ) &
done
```

Oder hier ein Java-Prog:


```
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.regex.Pattern;

public class uptime {

	String hostName = "XXX.XXX.";												//Beginn des zu pingenden Hostnamens
	Process p;																// Objekt p wird erzeugt, an das i. Folgenden der Konsolenbefehl ausgeführt wird

	public void pingen() {
		for (int nr = 60; nr <= 80; nr++) {									//Schleife bildet aus XXX.XXX + lf. Nummer konkatenierten String -->  
			try {															// bspw. hostname + nr = 192.168.1.60
				p = Runtime.getRuntime().exec("ping -c 1 " + hostName + nr); // bspw. ~$ ping -c 1 192.168.1.60 
			} catch (IOException ioe1) {
				System.out.println("Fehler beim Aufruf des ping-Befehls der Konsole.");
			}
			BufferedReader br = new BufferedReader(new InputStreamReader( 	//Liest den Ausgabestrom der Konsole in den Puffer
					p.getInputStream()));
			try {
				String zeile = null;
				while ((zeile = br.readLine()) != null) {					//durchlaeuft den Puffer zeilenweise
					if (Pattern.matches(".*Unreachable.*", zeile)			// sucht nach dem Muster "Unreacheable" oder 100% packet loss
							|| Pattern.matches(".*100% packet loss*.", zeile)) {
						System.out.println("Host " + hostName + nr
								+ " is NOT responding");
						break;
					}
					if (Pattern.matches(".*1 received.*", zeile)) {			//sucht nach dem Muster 1 received im Erfolgsfall
						System.out.println("Host " + hostName + nr
								+ " is responding");
						break;
					}
				}
			} catch (IOException ioe2) {
				System.out.println("Auslesen des Puffers ist gescheitert.");
			}
		}
	}

	public static void main(String[] args) {
		uptime up = new uptime();
		up.pingen();
	}
}
```

Funktioniert sauber unter *nix aber nicht in Windows Rechnern, da dort der ping-Befehl andere Parameter hat. Just my 2 Cents...

lg,
Semo


----------



## Bierhumpen (8. Dez 2010)

maki hat gesagt.:


> Quatsch ist dein "Kommentar", wenn du eine Frage, stelle sie einfach.


Ich hab keine Frage, ich wollte es nur als Quatsch kennzeichnen, bevor das noch jemand glaubt.


----------



## maki (8. Dez 2010)

Bierhumpen hat gesagt.:


> Ich hab keine Frage, ich wollte es nur als Quatsch kennzeichnen, bevor das noch jemand glaubt.


Spar dir deinen Müll in Zukunft, offensichtlich weisst du weder wovon du sprichst, noch kannst du darüber diskutieren.

Einen BugMeNot Account zu haben bedeutet nicht dass du dich hier daneben benehmen darfst.


----------



## Bierhumpen (8. Dez 2010)

maki hat gesagt.:


> Spar dir deinen Müll in Zukunft, offensichtlich weisst du weder wovon du sprichst, noch kannst du darüber diskutieren.
> 
> Einen BugMeNot Account zu haben bedeutet nicht dass du dich hier daneben benehmen darfst.


Wenn du meinst... immerhin bin nicht ich derjenige, der Anfängern hier falsche Behauptungen ins Gehirn setzt.

Moderator zu sein bedeutet nämlich nicht automatisch immer Recht zu haben.


----------



## maki (8. Dez 2010)

> Wenn du meinst... immerhin bin nicht ich derjenige, der Anfängern hier falsche Behauptungen ins Gehirn setzt.


Doch, genau das machst du: Falsche Infos verbreiten und nicht über die Info selber diskutieren.

Was genau soll denn "Quatsch" gewesen sein?



> Moderator zu sein bedeutet nämlich nicht automatisch immer Recht zu haben.


Richtig, es heisst aber auch nicht sich von jedem Blöd anreden zu lassen.


----------



## Semox (8. Dez 2010)

Jungs, jetzt beruhigt Euch... Ist die Sache nicht wert, oder? Mich interessiert das Thema... Würde gern noch andere Lösungen sehen und das geflame ist kontraproduktiv... :bahnhof:


----------



## SkonroX (8. Dez 2010)

Also das Programm läuft nun einwandfrei, habe nur noch einige änderungen dran vorgenommen, wie nach jedem erstellten Thread eine 25ms lange pause, und ständige überprüfungen ob die Threads auch wirklich schon fertig sind vor beendigung der schleife, bzw. bevor die nächste reihe an Threads gestartet wird.
Bin gerade dabei ein UI noch dafür zu erstellen, sodass alles ganz simpel über eine oberfläche eingestellt werden kann und das schwierigste dabei unsichtbar bleibt, geholfen haben mir hier leider nicht viele, dennoch danke an alle die es versucht haben, top 

Mfg,
SkonroX


----------



## FArt (9. Dez 2010)

SkonroX hat gesagt.:


> ..., geholfen haben mir hier leider nicht viele, dennoch danke an alle die es versucht haben, top
> 
> Mfg,
> SkonroX



Ich versuch im Namen der Community zu sprechen: wir entschuldigen uns, dass wir dir leider nicht besonders helfen konnten. Es war ausschließlich unsere Schuld und liegt somit voll in unserer Verantwortung. Zumindest übernehme ich die volle Verantwortung und werde von all meinen Posten geschlossen zurücktreten. Möge so etwas nie wieder vorkommen. 
Ich überlege ebenso, mich öffentlich zu entleiben... zumndest bei YouTube... mal sehen...


----------



## SkonroX (9. Dez 2010)

Was lächerlicheres ist dir wohl gerade nicht eingefallen?


----------

