SocketException: Connection reset

vfl_freak

Premium-User
Hallo zusammen,
habe seit gestern ein böses Problem mit der genannten SocketException ....

Zuerst mal der Code:
Java:
public byte[] CommunicateData( byte[] RQB, String strIP, int nPort ) 
throws IOException 
{
      byte[] blwPBuffer = null;
      SocketAddress sockaddr = new InetSocketAddress( strIP, nPort );
      Socket csock = new Socket();
      csock.connect( sockaddr, m_REPSOCKETTIMEOUT );
      csock.setSoTimeout( m_REPSOCKETTIMEOUT );
      OutputStream cout = csock.getOutputStream();


      InputStream cin = csock.getInputStream();  // tritt hier auf ******


      cout.write( RQB );
      byte[] blwPBufferTemp = new byte[MAXBUFFERLEN];
      byte[] blwPBufferHeader = new byte[16];
      int len = cin.read( blwPBufferHeader, 0, 16 );
      int nsize = 0;
      if (blwPBufferHeader[0] == BUFFER_START) 
      {
        nsize = ByteHelper.getRSPDataSize( blwPBufferHeader );
        int lenneu = 0;
        blwPBuffer = new byte[BUFFER_OFFSET + 1 + nsize];
        
        for (int n = 0; n < BUFFER_OFFSET; n++) 
        {
        	blwPBufferTemp[n] = blwPBufferHeader[n];
        }
        
        while( (nsize + BUFFER_OFFSET) > len ) 
        {
        	lenneu = cin.read( blwPBufferTemp, len, (nsize - len + BUFFER_OFFSET) );
        	len += lenneu;
        }
        
        for( int k = 0; k < len; k++ ) 
        {
        	blwPBuffer[k] = blwPBufferTemp[k];
        }

        cin.close();
        cout.close();
        csock.close();
        WorkerErrorStatus.getInstance().setErrorWS( com.gselectronic.worker.status.IWorkerErrorStatus.WORKERERRORSTATUS_NOERROR );
      }
    return blwPBuffer;
  }

Das Ganze tritt in einer funktionierenden Anwendung auf, die hier bei uns im Hause ca. 40 - 50 mal problemlos läuft.
Interessanterweise jedoch dabei nur auf genau drei PCs, die allesamt in den letzten Tagen entweder neu aufgesetzt wurden oder komplett neu sind. Die Java-Version ist überall 1.6.0_29. Ich habe bei einem der drei Rechner dann mal auf Java 1.6.0_30 upgedatet, aber leider ohne Erfolg ....

Es handelt sich durchweg um Rechner mit WinXP-SP3 !

Leider liefert eine Websuche hier weder Erklärungen noch mögliche Ursachen.
Deswegen hoffe ich, ggf. hier Hilfe zu finden !

Gruß
Klaus
 
Mit welchen Parametern wird die Methode aufgerufen? mit eine IP-Adresse oder einem Hostnamen? Letzteres könnte nämlich Probleme bereiten, falls der Hostname nicht aufgelöst werden kann (z.B. weil auf den frisch aufgesetzten Rechnern kein lokaler DNS-Server konfiguriert ist).
 
Hi,

würde zur Fehlersuche auch noch Wireshark mitlaufen lassen. Die Exception wird nämlich auch geworfen, wenn der Server die Verbindung trennt. Eventuell hilft dir der genaue Ablauf der Konversation ja weiter.

Gruß,
BK
 
Moin,

Mit welchen Parametern wird die Methode aufgerufen? mit eine IP-Adresse oder einem Hostnamen? Letzteres könnte nämlich Probleme bereiten, falls der Hostname nicht aufgelöst werden kann (z.B. weil auf den frisch aufgesetzten Rechnern kein lokaler DNS-Server konfiguriert ist).

Aufruf geht eigentlich über die echte IP des Zielrechners (http://www.xxxx.yyy.zzz) und die Portnummer. Werde das am Montag aber trotzdem mal von unserer Netzwerkkabteilung prüfen lassen - Danke!

Sah zu dem gerade, dass ich vorhin im ersten Post, die falsche Stelle bezeichnet habe ... mea culpa :-(
Es passiert natürlich beim READ :
Java:
public byte[] CommunicateData( byte[] RQB, String strIP, int nPort ) 
throws IOException 
{
      byte[] blwPBuffer = null;
      SocketAddress sockaddr = new InetSocketAddress( strIP, nPort );
      Socket csock = new Socket();
      csock.connect( sockaddr, m_REPSOCKETTIMEOUT );
      csock.setSoTimeout( m_REPSOCKETTIMEOUT );
      OutputStream cout = csock.getOutputStream();
      InputStream cin = csock.getInputStream();
      cout.write( RQB );
      byte[] blwPBufferTemp = new byte[MAXBUFFERLEN];
      byte[] blwPBufferHeader = new byte[16];


      int len = cin.read( blwPBufferHeader, 0, 16 );    // tritt hier auf    ! ! ! ! 


      int nsize = 0;
      if (blwPBufferHeader[0] == BUFFER_START) 
      {
        nsize = ByteHelper.getRSPDataSize( blwPBufferHeader );
        int lenneu = 0;
        blwPBuffer = new byte[BUFFER_OFFSET + 1 + nsize];
        
        for (int n = 0; n < BUFFER_OFFSET; n++) 
        {
            blwPBufferTemp[n] = blwPBufferHeader[n];
        }
        
        while( (nsize + BUFFER_OFFSET) > len ) 
        {
            lenneu = cin.read( blwPBufferTemp, len, (nsize - len + BUFFER_OFFSET) );
            len += lenneu;
        }
        
        for( int k = 0; k < len; k++ ) 
        {
            blwPBuffer[k] = blwPBufferTemp[k];
        }
 
        cin.close();
        cout.close();
        csock.close();
        WorkerErrorStatus.getInstance().setErrorWS( com.gselectronic.worker.status.IWorkerErrorStatus.WORKERERRORSTATUS_NOERROR );
      }
    return blwPBuffer;
  }

Gruß
Klaus
 
Zuletzt bearbeitet:
Moin Bratkartoffel (was für ein Name, da bekomme ich ja schon wieder Hunger ... :D),

würde zur Fehlersuche auch noch Wireshark mitlaufen lassen. Die Exception wird nämlich auch geworfen, wenn der Server die Verbindung trennt. Eventuell hilft dir der genaue Ablauf der Konversation ja weiter.

ok, Danke - das ist sicher auch noch ein guter Ansatz. Muss mich damit mal beschäftigen !

Gruß
Klaus
 
Zurück