Ports prüfen -> Logikhilfe

Alex Großmann

Erfahrenes Mitglied
Ports prüfen -> Logikhilfe && Exceptions

Hallo :)

In der Hoffnung meinen letzten Hilferuf abzugeben (dannach werd ich mal schauen ob ich evt. euch mal helfen kann xD) muss ich mich nochmal an euch wenden.

Ich will Ports über Socket verbindungen Prüfen, das ist ja echt easy, aber ich hab ein paar Probleme mit den Exceptions.

Folgende Logik muss das haben:

Programm schaut ob port x auf ip y (wurden beide vorher eingegeben und der Methode übermittelt) vorhanden ist. Wenn ja, dann wayne und weiter mit der nächsten IP, wenn nein dann schauen ob Port 135 oder 445 an der IP ist. Wenn ja dann ausgeben. Wenn nicht, dann schauen welcher Port an der IP hängt.

Die if und for verzweigungen trau ich mir noch zu, aber ich hab keine Ahnung wie ich die Exceptions bekomme die quasi ja/nein sagen.... könnt Ihr mir da helfen? :)

Außerdem: Um das ganze zu beschleunigen, weil Port prüfen dauerd ja gewisse Zeit, will ich das ganze Multithreadding fähig machen. Kann man eine Methode threadfähigmachen? Oder muss es ne Klasse sein?

Edit:
Ich habe nun in der API folgendes gefunden:
Java API hat gesagt.:
Throws:
UnknownHostException - if the IP address of the host could not be determined.
IOException - if an I/O error occurs when creating the socket.
SecurityException - if a security manager exists and its checkConnect method doesn't allow the operation.

Ich verstehs trotzdem nicht.... ich frag also quasi: hey ist port x bei dir offen? -neee der ist belegt.
Das heißt ja dann quasi das etwas drauf läuft, und ich will ja quasi wissen ob was drauf läuft..
Aber wenn jetzt z.b. Port x zu wäre, und der schaut welche Ports offen sind, macht das doch gar keinen Sinn oder?

Edit2:

Ich hab jetzt mal sowas geschrieben:
Java:
  while (port1  <  65536 && check == false){      
	      	try {
			Socket s= new Socket (remote, port1);
			System.out.println("Ein Programm horcht auf: "+port1+".  IP: " + hostname);
			check = true;
			s.close();
	      } catch (IOException e) {
	    	  System.out.println("Kein Programm horcht auf: " + port1+ " . IP: "+hostname);			
			e.printStackTrace();
					try {
					Socket s= new Socket (remote, winport1);
					System.out.println("Die IP: " + hostname + "hängt an Win-Port: " + winport1);
					check = true;
					s.close();
			      } catch (IOException b) {
			    	  System.out.println("Kein Programm horcht auf: " + port1+ " . IP: "+hostname);			
					b.printStackTrace();
					check = false;
					try {
						Socket s= new Socket (remote, winport2);
						System.out.println("Die IP: " + hostname + "hängt an Win-Port: " + winport2);
						check = true;
						s.close();
				      } catch (IOException a) {
				    	  System.out.println("Kein Programm horcht auf: " + port1+ " . IP: "+hostname);			
						a.printStackTrace();
						check = false;
						}
				      catch (SecurityException c ){
				    	  b.printStackTrace();
				    	  System.out.println("Check Versuch wird geblockt");
					}
		      		      
			}
	      catch (SecurityException b ){
	    	  b.printStackTrace();
	    	  System.out.println("Check Versuch wird geblockt");
	    	  }}
	   
	 if (check == false){
	     port1++;
	}}
(Exception Ausgaben noch nicht überarbeitet ;) )

Leider bekomm ich ne "java.net.ConnectException: Connection timed out: connect" Exception... versteh nicht warum, den wenn ich nur nen Socket auf die IP und Port abgebe gehts, aber hier nicht oO


Edit3:
Hiermit gehts schonmal....nur leider zählter die Portnummer nicht hoch? Warum das den...

Java:
 for ( int port2 = port1; port2 < 65536; port2++) {
	          
	        	while (check == false){
	                try {
	                Socket s = new Socket(remote,port2);
	                System.out.println("Gegenstelle hat Port Nummer: " + port+ ". IP Adresse:  " + hostname);
	                s.close();
	                check = true;
	            }
	                catch (IOException ex) {
	              System.out.println("Gegenstellen hat nicht:  " + port+ ". IP Adresse:  " + hostname);
	            
	              try {
		                Socket s = new Socket(remote,winport1);
		                System.out.println("Gegenstelle hat Port Nummer: " + winport1+ ". IP Adresse:  " + hostname);
		                s.close();
		                check = true;
		            }
		                catch (IOException ex1) {
		              System.out.println("Gegenstellen hat nicht:  " + winport1+ ". IP Adresse:  " + hostname);
		              
		              try {
			                Socket s = new Socket(remote,winport2);
			                System.out.println("Gegenstelle hat Port Nummer: " + winport2+ ". IP Adresse:  " + hostname);
			                s.close();
			                check = true;
			            }
			                catch (IOException ex2) {
			              System.out.println("Gegenstellen hat nicht:  " + winport2+ ". IP Adresse:  " + hostname);
			            }
		            }
	            }
	        }//for ends
	        }//if ends
 
Zuletzt bearbeitet:
Hey,

in deinem zweiten Beispiel:
Wie bzw. wo werden die Variablen "port", "winport1" "winport2" deklariert?

In dem Auszug änderst du die Variablen nicht, daher kann sich der Port, den du anzeigst, auch nicht ändern.

mfg
bo
 
Was mir immer noch nicht klar wird : "gucken an welchem Port die Maschine läuft" ...
Hat dir schon mal wer verraten das es 65535 möglich Ports gibt ? Und das sogar zwei mal ... einmal TCP und einmal UDP. Selbst wenn du das auf n haufen Threads verteilst dauert das immer noch ganz schön lange. Du solltest dich hier also auf eine gewisse Anzahl beschränken.
 
Huhu BO,

danke für deine Antwort!

Also winport1 , winport 2 werden in der Methode deklariert (134,445).
port ist quasi ne globale Variable welche übergeben wird. In Ihr steht die Auswahl welche im Portprogramm getroffen wurde (also dort kann man einen beliebigen Port aussuchen und übergeben)..

Du hast echt recht, der zählt die Sache nicht hoch. Mal davon abgesehen das ich gern hätte das er von 0 - 65535 hochzählt und dann z.B. checkt obs eins der 3. vorbestimmten Ports ist, und ggf. abbricht...

@ Spike,
ja weiß ich, egal wie lang das Programm braucht, geht nicht um schnelligkeit... wobei ichs halt auch heftig finde, aber da werd ich halt mal paar Threads nebenher laufen lassen müssen. Wie gesagt, die Zeit ist egal, das kann ruhig nen ganzen Tag brauchen...


Edit:
Ich brauch btw nur TCP, also UDP muss ich nix prüfen.

So ich habs jetzt mal lauffähig bekommen :) Er prüft erst ob die Windowsports erreichbar sind, wenn nicht ob der eig Port welcher eingegeben wurde erreichbar ist, wenn nicht (d.h. er würde abbrechen wenn einer der 3 da ist -> zeit sparen) zählt er von 0 -65535 hoch...

Java:
   try {
                 Socket s = new Socket(remote,port);
                 System.out.println("Gegenstelle hat Port Nummer: " + port+ ". IP Adresse:  " + hostname);
                 s.close();
                 check = true;
             }
                 catch (IOException ex) {
               System.out.println("Gegenstellen hat nicht:  " + port+ ". IP Adresse:  " + hostname);
             
               try {
                     Socket s = new Socket(remote,winport1);
                     System.out.println("Gegenstelle hat Port Nummer: " + winport1+ ". IP Adresse:  " + hostname);
                     s.close();
                     check = true;
                 }
                     catch (IOException ex1) {
                   System.out.println("Gegenstellen hat nicht:  " + winport1+ ". IP Adresse:  " + hostname);
                   
                   try {
                         Socket s = new Socket(remote,winport2);
                         System.out.println("Gegenstelle hat Port Nummer: " + winport2+ ". IP Adresse:  " + hostname);
                         s.close();
                         check = true;
                     }
                         catch (IOException ex2) {
                       System.out.println("Gegenstellen hat nicht:  " + winport2+ ". IP Adresse:  " + hostname);
                      
                       int port2 = 0;
                       while (check == false || port2 <= 65535){
                       
                    	  
                       
                    		   try {
                    			   
                    			   Socket s = new Socket(remote,port2);
                    			   System.out.println("Gegenstelle hat Port Nummer: " + port2 + ". IP Adresse:  " + hostname);
		                           s.close();
		                           check = true;
                    		   }
                             catch (IOException ex3) {
                           System.out.println("Gegenstellen hat nicht:  " + port2+ ". IP Adresse:  " + hostname);
                           
                           check = false;
                         }
                         port2 = port2 + 1;    
                     }
                 }
             }
         }
         }

Was haltet ihr davon? Er durchläuft grad meine Locale IP und dannach die eines Kollegen, mal sehen ob das klappt....
Als nächstes muss deffinitiv Multithreadding her :D


Edit2:

Kann man die Methode threadfähigmachen und den thread auch gleich starten? will net extra das alles in einzelne klassen trennen-.-
 
Zuletzt bearbeitet:
Hi,

Warum
Java:
while (check == false || port2 <= 65535){
müssen nicht eher beide Bedingungen erfüllt sein?
also:
Java:
while (!check && port2 <= 65535){

Multi-Threading ohne zusätzliche Klasse denke ich geht nicht, zumal du ja beliebig viele Objekte erzeugen willst um sie nebeneinander laufen zu lassen und in der Haupt-Klasse zu referenzieren. Eine anonyme Klasse würde es aber wohl auch tuen.

Gruß javaDeveloper2011
 
Danke! hast natürlich Recht mit der Schleife :)

Was ist eine anonyme Klasse? Wie wird das dann aufgebaut?

Ich mach meine Methode als thread und sag dann der anonymen Klasse das es x mal gleichzeitig laufen soll oder?
 
Ähm ... also solche Aufgaben mit anonymen Klassen durchzuführen auf die man keinerlei Referenzen hat wäre äußerst schlecht da du ja wenn ein Thread erfolgt hat alle anderen "abbrechen" müsstest. Wie wir nun aus langer Java-Erfahrung wissen ist es ein nicht gerade tolles Design einen Thread von außen "gewaltsam" zu beenden. Viel mehr sollte man in seinen Thread *sofern er denn aus einer oder mehreren Schleifen besteht* regelmäßig auf eine global Status-Variable prüfen. Um soetwas allerdings mit anonymen Klassen zu tun müsstest du eben genau diese globale Variable "final" deklarieren was es dir verbitet diese im nachhinein zu ändern. "Echte" Klassen auf die man auch referenzieren kann eignen sich wenn überhaupt besser dafür.

Auch solltest du nicht den standard-Konstruktor von Socket benutzen da dieser ein viel zu langes Timeout hat. Um dies zu umgehen verwendet man stattdessen den null-Konstruktor *also den ohne jegliche Parameter* und ruft dann die Socket.connect(InetSocketAddress, int) Methode mit entsprechenden Timeout auf. Aber selbst wenn du das Timeout auf 2sec festlegst und meinet wegen 10 Threads gleichzeitig laufen lässt ergibt das immer noch einen Zeitaufwand von
65535 x 2sec / 10 Threads = 13107sec was ungefähr 220 Minuten oder 3 1/2 Stunden ergibt. Du kannst zwar auch mehr als 10 Threads starten ... jedoch wirst du dann nicht wesentlich schneller da bei einem "Standard" Windows die maximale Anzahl von gleichzeitigen Verbindungen auf 10 beschränkt ist *bei Win 7 glaube ich ETWAS höhre ... aber nicht viel*.
So ... und wenn du jetzt diese 3 1/2 Stunden *worst case* für EINEN Rechner nimmst ... dann kannst du dir ausrechnen das es für ein ganzes Netzwerk locker mehr als ne Woche dauern kann. Mit dem Standard-Timeout des Socket(String, int)-Konstruktors wirds natürlich noch länger weil dies länger als 2sec sind *sind glaub ich 5sec oder sowas*.

Du siehst also : mit ein wenig simpler Mathematik hebel ich deinen kompletten Ansatz aus ... da die benötigte Zeit im "worst case scenario" "schlechtester anzunehmender Umstand" in keinem Verhältnis zum Nutzen steht.

Ich selbst habe eine veränderte WinSocks-Lib die es mir ermöglicht bis zu 16'000 Verbindungen pro Anwendung und ALLE 65535 möglichen *wenn ALLE Ports belegt werden* gleichzeitig zu nutzen. Das hat allerdings den Preis das mein Windows , obwohl ich es rechtmäßig erworben , registriert und aktiviert habe , als NICHT-ECHT erkannt wird ... das wäre also keine Option für den Produktiven einsatz.


//EDIT
Mal ganz davon abgesehen das weder ein "normaler" Rechner noch ein relativ gutes Netzwerk mit einer solchen Flut von Paketen *in Bezug auf die veränderte WinSocks-Lib mit bis zu 16'000 Sockets pro Anwendung* fertig werden würde. Auch würde es ein "normaler" Rechner nicht mal fertig bringen so viele Threads laufen zu lassen *selbst ein Intel i7 mit 6 physischen Kernen aus denen sich dank Intel HT bis zu 12 logische machen lassen kommt nicht mit mehr als 6'000 bis 8'000 Threads klar*.
 
Zuletzt bearbeitet von einem Moderator:
Spike, außer Frage, da geb dir schon Recht. Das war mir auch echt heut Mittag schon bewusst und ich habe mit dem Herrn geredet der das Proggi dann benutzt. Er meinte das es Ihm egal sei, hauptsache das prüft alle Ports. Ich finds genau so...schwachsinnig wie du, das steht in keinem Verhältniss....
Aber wie gesagt, wenn er so haben will, muss ichs so hinnehmen oder?
Ich habe nunmal die erste Range durch genommen, waren ca. 150 IP´s (alle on gewesen) und es ging ruck zuck, aber es waren auch keine ohne den 3 vorgegebenen Ports drinnen^^..
 
Naja ... wenn ALLE Systeme auf den vorgegeben Ports erreichbar sind ist es schon klar das es recht fix geht. Ich habe ja auch nur das "worst case scenario" angeschnitten was passieren kann wenn eben viele Systeme NICHT "up-and-running" sind wie man so schön sagt.
 
Wie gesagt, mir ist das durchaus bewusst, aber andere Möglichkeiten hab ich ja leider nicht...
Wäre besser gekommen wenn mans in ner anderen Sprache umgesetzt hätte, aber meine 1000Zeilen code will ich net umsonst geschrieben haben^^
 
Zurück