Multithreading

Kaladial

Grünschnabel
hi

is geht noch um meine ping geschichte...

ich hab mir jetzt überlegt, wieso soll ich jede ip addresse nacheinander überprüfen?
ich könnte doch auch einfach 255 threads erzeugen und diese auf jeweils eine ip scannen lassen...

das sollte doch eigentlich auch gehn...

nur hab ich noch nie nen multithread geschrieben ... könnte mir das jemand erklären oder mal nen beispiel programm schreiben bzw posten?

wäre supi nett

thx kala
 
Hi,

muss dies unbedingt in Threads erfolgen? Ich weiß ja nicht wie lang das dauert, aber ich weiß das wenn man bein Threads nicht aufpasst leicht viele Fehler macht. Ich kenn diesen Scann nicht, aber bedenke das die Thread Möglichkteit doch sehr speicher fressend sein kann
 
hmmm also ich habs ohne threads versucht das dauert einfach zu lange...

überleg mal ich will nen ip bereich abscannen... nur im c class netzwerk sind das schon 253 scanns ...
wenn ich nen a class netzwerk hab und es unmengen mehr...

und ich muss den rechnern ja ne möglichkeit lassen zu antworten...

also wenn ich mal überleg 253 scanns auf 253 adressen -1 (eigene muss ja net mitgescannt werden) 252 * ca 250 millisekunden = 63 sekunden ... und ich würde das aber gern in ca 5-10 sekunden erledigt haben ... und 250 ms sind net viel ...

bei t´hreads kann ich 5 sec antwortzeit geben und dann einfach jeden thread auswerten ...
 
Probiers dann vieleicht mal aus, das ein Thread von 0 bis zur Hälfte - 1 scannt und ein Anderer von ganz oben bis zur Hälfte. Probier mal aus wie sich dann die Zeit ändert. Ansonsten kanns du auch alle Adressen in 3 Bereiche aufteilen und für jeden einen Thread laufen lassen. Aber wie schon gesagt ich würde dir nicht empfelen zu viele Threads zu machen
 
Code:
package AVS3;

import java.io.*;
import java.net.*;
import java.io.IOException;
import java.util.ArrayList;

public class Ping4 {
	
	private static class connector extends Thread {
		
		private volatile boolean shutdown = false;
	
		public connector() {
			setName("connector");
		}
		
		public void shutdown() {
			shutdown = true;
		}
		
		public void run() {
			while(!shutdown) {
				// Attempt to complete the connection sequence
				Socket theSock = null;
				try {
					/*InetAddress addr = InetAddress.getByAddress(addr1);
					System.out.println(addr);			
					SocketAddress sockaddr = new InetSocketAddress(addr,port);

					theSock = new Socket();
					theSock.connect(sockaddr, timeoutMs);*/
					shutdown();
				} catch (Exception ex) {
					System.out.println(ex);
				} finally {
					if (theSock != null) {
						try {
							theSock.close();
						} catch (Exception e) {System.out.println(e);}
					}
				}
			}
		}
	}
	
	public static long testConn(byte[] addr1, int port, int timeoutMs){
		long total = -1;
		ArrayList<connector> freds = new ArrayList(); 

		connector fred = new connector(); 
		fred.start(); 
		freds.add(fred); 
				
		return total; //returns -1 if timeout
	}
	
	public static void main( String[] args ){
		int port = 10000;
		int timeout = 5000;
		for(int i=0; i<255; i++){
			byte[] addr = new byte[]{(byte)172,(byte)16,(byte)16,(byte)i};
			System.out.println("i:"+i+" "+Ping4.testConn(addr, port, timeout));
		}
	}
}

also ich habs im mom soweit...
1.) ich weis nur nich wie ich addr, port, timeout in meinen thread bekomm
2.) wie ich aus meinem thread nen rückgabewert bekomm mitdem ich weiterarbeiten kann
 
zu 2.) Du könntest zum Beispiel einen Vector in der Klasse anlegen, in dem du alle Daten rein legen kannst, musst halt aufpassen, dass sich die Threads net gegenseitig überschreiben
 
Du könntest zum Beispiel eine Klasse ScanResult machen, die einen Vector enthält. Von dieser Klasse erzeugst du ein Objekt und gibst diese jedem Thread mit. über diese Objekt können die Threads ihre ergebnisse dann in dem Vector Speichern. So ähnlich hab ich ein ähnliches Problem auch schon mal gelöst
 
hmm, in deinem Quellcode ist so ziemlich alles statisch, hast du dich schonmal mit objekt orientierter Programmierung auseinandergesetzt?

Sorry aber mit Quellcode wirds schwierig, da ich mich weder mit Ports noch mit Java.net und Netzwerken auskenne, allenfalls ein allgemeines Beispiel
 
Zuletzt bearbeitet:
Zurück