IP-Adressen rausfischen

SkonroX

Aktives Mitglied
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:
Java:
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:
Java:
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

Top Contributor
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

Aktives Mitglied
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

Top Contributor
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
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

Top Contributor
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

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

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

FArt

Top Contributor
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

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

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?

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

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

Gast2

Gast
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 ;)

Java:
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

Top Contributor
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:
Java:
	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?
 
Zuletzt bearbeitet:

SkonroX

Aktives Mitglied
Soooo... neuer Code:
Java:
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:
Java:
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(); }
		}
	}
}
 
M

maki

Gast
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

Aktives Mitglied
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

Top Contributor
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

Aktives Mitglied
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
 

Andi_CH

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

Andi_CH

Top Contributor
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
 
Zuletzt bearbeitet:

ARadauer

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

Java:
	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?

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

ARadauer

Top Contributor
hier deine classa schleife

Java:
        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?

Java:
		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

Top Contributor
Java:
		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. :D
 

SkonroX

Aktives Mitglied
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:

Java:
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:

Java:
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
 
M

maki

Gast
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 ==

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.

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.

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.

laufen tut der code nur bedingt, unzwar gibt das programm nicht alles aus, und dazu haufenweise doppelt.
Debuggen & Logausgaben helfen da.
 

SkonroX

Aktives Mitglied
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
 
M

maki

Gast
die writer werden ja nicht nach der exception, sondern nach der schleife geschlossen,
Java:
        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

Top Contributor
Java:
        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.

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?
 

FArt

Top Contributor
"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...
 
M

maki

Gast
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

Bekanntes Mitglied
Hi

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

Java:
#!/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:

Java:
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
 
Zuletzt bearbeitet:
M

maki

Gast
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

Bekanntes Mitglied
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.
 
M

maki

Gast
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

Bekanntes Mitglied
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

Aktives Mitglied
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

Top Contributor
..., 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...
 

Ähnliche Java Themen


Oben