Netzwerk nach ip adressen scannen

SkonroX

Aktives Mitglied
Hallo,

ich experimentiere seit einiger Zeit an so manchen Programmen, eins von denen ist eines, welches alle vorhandenen IP-Adressen samt Computernamen ausgeben soll, was mir zwar gelungen ist, jedoch dauert es 2³²³²³²³ stunden bis es fertig ist, da ich nicht verstehe wie ich ein Socket Timeout einstellen kann, habe es bereits mit verschiedenen möglichkeiten versucht, eines war mit socket.setsotimeout(zahl), und noch eine mit internetaddress oder sowas, funktioniert alles nicht, denn sobald ich einen timeout einstelle, egal ob es ein wert von 50 - 50000 ist, findet der scanner keinen einzigen rechner mehr, frage mich nur wieso...
Hier der 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 */
	private static Object[] e;
	private static String hostip = null;		
	private static int port = 445;
	private static Socket socket;
	private static InetAddress host;
	private static File file = new File( System.getProperty( "user.home" ) + "/desktop/IP-Liste.txt" );
	private static long roundTripTime;
	private static BufferedWriter bw = null;
	private static String klasse = "c";
	private 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
	{
		int j = 20;
   	  	bw = new BufferedWriter( new FileWriter( file ) );
		for( int i = 155; i < 256; i++ )
		{
			hostip = "172.16." + j + "." + i;
			if( ( e = ping( hostip, port ) ) != null )
		    {
				System.out.println( "HostIP: " + e[ 0 ] + " " + "HostName: " + e[ 1 ] + " " + "MilliSeconds: " + e[ 2 ] );
		   	  	bw.write( "HostIP: " + e[ 0 ] + " " + "HostName: " + e[ 1 ] + " " + "MilliSeconds: " + e[ 2 ] );
		   	  	bw.newLine();
		   	  	bw.flush();
		    }
			if( i == 255 && j < 256 ) { j++; i = 0; }
			if( j > 255) { break; }
		}
		bw.close();
	}
	private static void classb() throws IOException
	{
		int j = 0, k = 0;
		for( int i = 0; i < 256; i++ )
		{
			hostip = "172." + k + "." + j + "." + i;
			if( ( e = ping( hostip, port ) ) != null )
		    {
		   	  	System.out.println( "HostIP: " + e[ 0 ] + "\n" + "HostName: " + e[ 1 ] + "\n" + "MilliSeconds: " + e[ 2 ] );
		    }
			if( i == 255 ) { j++; i = 0; }
			if( j == 255 && i == 255 ) { k++; i = 0; j = 0; }
			if( j > 255 || k > 255) { break; }
		}
	}
	private static void classa() throws IOException
	{
		int j = 0, k = 0, l = 0;
		for( int i = 0; i < 256; i++ )
		{
			hostip = l + "." + k + "." + j + "." + i;
			if( ( e = ping( hostip, port ) ) != null )
		    {
		   	  	System.out.println( "HostIP: " + e[ 0 ] + "\n" + "HostName: " + e[ 1 ] + "\n" + "MilliSeconds: " + e[ 2 ] );
		    }
			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; }
		}
	}
	public static Object[] 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();
            return ( new Object[]{ host.getHostAddress(), host.getHostName(), roundTripTime } );
        }
        catch( Exception e )
        {
        	System.out.println( e + " = " + hostip );
            return null;
        }
    }
}

explizit ist der schwerpunkt des problems in Zeile 90 - 106, in der Object methode, in welcher die netzabfrage stattfindet.
Bin um jede hilfe dankbar,
Mfg,
SkonroX.
 
Mach main mal public - das kommt besser
Klassenamen sollten gross geschrieben werden-> Scan

Ping braucht zum Teil einfach lang bis die Antworten kommen. Vielleicht kann man die Anzahl Pings und die Zeit einschränken?

Ohne jetzt jedes Detail zu verstehen schlage ich vor, dass du parallelisierst.
Starte pro ping Versuch einen Thread und lass so einige 100, vielleicht auch einige 1000 davon laufen (Musst halt ausprobieren was dein System so verkraftet)
Da diese Threads ja eigentlich nur auf Antworten warten, ist die CPU Last eher klein und Memory wird, wenn die Threads klein sind, auch nicht übermässig viel verbraucht.
 
1. Mich interessieren auch eigentlich nur die maschinen, die auch darauf antworten können
2. Nein ich habs nicht ausgerechnet, würde auch lieber ^99 schreiben, aber es gibt ja auf der Tastatur nur ²³ ;P
3. Ich tuh mich schwer mit Threads, könnte jemand vielleicht ein beispiel zeigen? 🙂
 
So, ich habe mich nun noch etwas über Threads informiert und mich mal dran versucht, jedoch will es wie ich es mir bereits dachte nicht so wirklich...
Habe eine neue Klasse geschrieben, in welcher ich den Ping vorgang eingebunden habe, wodurch ich also nur noch die ip in der hauptklasse ständig aktualisieren muss und jeweils neue Threads für diese öffnen..
hört sich logisch und plausibel an, funktioniert aber nicht, ich bekomme folgende fehlermeldung:
Exception in thread "main" java.lang.OutOfMemoryError: unable to create new native thread

Hier der Code von der zweiten Klasse (Ping):

Java:
package LAN_SCAN;
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;
	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 );
       }
    }
	public void run()
	{
		ping( scan.hostip, scan.port );
	}
}

Mfg,
SkonroX.
 

Neue Themen


Zurück
Oben