# seltsames SocketTimeout bei CONNECT



## VfL_Freak (6. Nov 2012)

Moin,

da wir gelegentlich mal Probleme mit SocketTimeouts haben, hatte mein Chef jetzt die schlaue Idee, bspw. das Connect solange zu wiederholen, bis es erfolgreich war.
Dabei tritt hier nun mit diesem Code folgendes auf:

```
try 
{
//    	SocketAddress sockaddr = new InetSocketAddress(strIP, MCD_DATA_PORT);
//    	sock = new Socket();
//    	sock.connect(sockaddr, MCDSOCKETTIMEOUT_REST);
    	
    	boolean bIsOK = false; 
    	while( !bIsOK )
    	{
    		try 
    		{
    			SocketAddress sockaddr = new InetSocketAddress(strIP, myPORT);
    			sock = new Socket();
    			sock.connect(sockaddr, MCDSOCKETTIMEOUT_REST); // <== TIMEOUT !!!
    			if( sock.isConnected() )
    			{
    				bIsOK = true;
    			}
    		}
    		catch( Exception ex )
    		{
    			System.out.println( "wiederholtes socket.connect (myFunction)" );
    			ex.printStackTrace();
    		}
      } // while
    	
      if( sock.isConnected() )
      {
	    int iTest = 5;  // habe ich nur auf die Schnelle eingebaut, 
                               // um hier einen Breakpunkt zu setzen !!
      }
// ..
}
catch (...)
```
Wenn statt der der drei Zeilen die komplette while-Schleife auskommentiert ist (die bisherige Logik), klappt das Connect anstandslos (d. h. ich laufe bis zum Breakpunkt bei iTest).

In der Version wie hier dargestellt, bekomme ich permanent auschließlich nur SocketTimeouts ....
Habe schon versucht, die Socket im catch-Block zu closen oder auch vor der Schleife zu deklarieren, bringt aber alles nix - immer nur STOs ???:L

Habe leider keine Idee mehr, womit das zusammenhängen könnte und hoffe auf Hilfe!

Ein try-catch innerhalb eines try-catch sollte doch auch problemlos gehen ....

Danke und Gruß
Klaus


----------



## Bernd Hohmann (6. Nov 2012)

VfL_Freak hat gesagt.:


> Habe leider keine Idee mehr, womit das zusammenhängen könnte und hoffe auf Hilfe!



Der Fehler könnte daher kommen, dass Du im Auskommentierten Teil als Port "MCD_DATA_PORT" nutzt, in der Schleife aber "myPort"

Ansonsten: auch Inet(Socket)Address können (denke ich mal) einen Timeout liefern wenn der Nameserver nicht in die Hufe kommt.

Bernd


----------



## Gast2 (6. Nov 2012)

Moin,

ansonsten noch ein Thread.sleep() einbauen im Catch. Sonst rauscht euch ein Kern mit 100% davon wenn kein Netzwerk(kabel) vorhanden ist.

hand, mogel


----------



## VfL_Freak (7. Nov 2012)

Moin,

erstmal Danke für Eure Antworten 
War leider gestern aufgrund eines Zahnarzttermins :shock: nicht mehr dazu gekommen, dies hier abzuschließen ....



Bernd Hohmann hat gesagt.:


> Der Fehler könnte daher kommen, dass Du im Auskommentierten Teil als Port "MCD_DATA_PORT" nutzt, in der Schleife aber "myPort"
> Ansonsten: auch Inet(Socket)Address können (denke ich mal) einen Timeout liefern wenn der Nameserver nicht in die Hufe kommt.


Das mit dem Port war hier mein (Tipp-)Fehler .... Es wird natürlich immer _*MCD_DATA_PORT*_ verwendet, ich hatte es im auskommentierten Teil nur nicht richtig ersetzt - mea culpa.

Bei der Socketadresse wird schon direkt die IP des Ziels angegeben, da hier im Haus die Rechner sowohl intern als auch extern angeschlossen sein müssen ...

Das Problem lag letztlich ganz woanders ....
Es gibt zwei verschiedene Rechner mit diesem MCD-Programm, die in meiner Anwendung nacheinander angefragt werden und von denen immer nur EIN Programm läuft. Es wird dabei immer erst A, dann B angefragt. Da in diesem Fall die Version B aktiv war, habe ich mit der while-Schleife eine Endlosschleife produziert, während für den auskommentierten Fall die aufrufende Logik dafür sorgte, das jede prüfung nur einmal kam - also erst A mit Fehler und dann korrekt B.

Ergo darf ich diese Prüfung hier an dieser Stelle so gar nicht durchführen !
Hat sich also erledigt 

Danke und Gruß
Klaus


----------

