Socket Error WSAECONNRESET



  • Hallo Leute,

    ich benutze WINAPI Sockets. Die Datenübertragung klappt soweit nur hin und wieder bringt die recv Funktion den Socket Error: WSAECONNRESET

    Wenn ich jetzt den Trace mit Wireshark aufzeichne sehe ich weder ein RST noch ein FIN Packet.

    Beschrieben wird der Fehler so.

    An existing connection was forcibly closed by the remote host. This normally results if the peer application on the remote host is suddenly stopped, the host is rebooted, the host or remote network interface is disabled, or the remote host uses a hard close (see setsockopt for more information on the SO_LINGER option on the remote socket). This error may also result if a connection was broken due to keep-alive activity detecting a failure while one or more operations are in progress. Operations that were in progress fail with WSAENETRESET. Subsequent operations fail with WSAECONNRESET.

    Aber auch der Fehler WSAENETRESET ist nicht aufgetreten.

    Was löst diesen Fehler noch aus?



  • ich bin auf diese Seite gestoßen

    http://www.sockets.com/err_lst1.htm#WSAECONNRESET

    dort steht das es auch auftreten kann wenn ein Netzwerkfehler aufgetreten ist, Nur wie bekomme ich jetzt heraus was da genau passiert ist?



  • Ich habe das Problem weiter untersucht und festgestellt das wenn die Clienten alle auf unterschiedlichen Rechnern befinden kein Verbindungsverlust auftritt (1 Rechner pro Client).

    Jetzt habe ich den embedded Server etwas genauer untersucht und festegestellt das er 5 Verbindungen auf Port 4060 haben kann. Wenn diese Verbindungen von Verschiedenen IP´s genutzt werden kein Problem. Sobald eine IP 2 Verbindungen zum selben Port 4060 hat gibt es Probleme auf genau diesem Clientrechner, dann verliert er die Verbindung mit dem Fehler WSACONNRESET. Die anderen Verbindungen mit anderen IP´s sind nicht betroffen.

    Nun hab ich folgende Testumgebung embedded Server 4 Testrechner wobei auf 3 Rechner eine Verbindung offen ist und auf einem 2 Verbindungen, dort trace ich die Ethernet Packete mit Wireshark mit.

    Wenn die Verbindung verloren geht dann ist das immer gleichzeitig bei beiden Verbindungen (2 Instanzen des sleben Programms). Auf dem Trace ist weder ein FIN oder RST des Rechners bzw. des Servers zu sehen. Aus diesem Grund sendet der server auch weiter Packete. Diese werden nur halt nicht mehr angenommen.

    Kommt Windows nicht klar bei mehreren Verbindungen zum selben Port.

    Daten rufe ich so ab

    while (!m_ThreadReceiveExit)
    	{
    		 if (bIsConnected)
    		 {
    			FD_SET(hSocket,&fdsRead);
    			FD_SET(hSocket,&fdsError);
    
    			if (select(0,&fdsRead,NULL,&fdsError,&tvTimout))
    			{
    				if (FD_ISSET(hSocket,&fdsRead))
    				{
    					if (0 < (ciRead = recv(hSocket,(char *)rgubRxBuffer,1800,0)))
    					{
    						for (i = 0; i < ciRead;i++)
    						{
    							rgubRxBuf[uwRxBufWrite] = rgubRxBuffer[i];
    							if (uwRxBufWrite < BUFLEN-1) uwRxBufWrite++;
    							else uwRxBufWrite = 0;
    						}
    					}
    					else
    					{
    						test = WSAGetLastError();
    						bIsConnected = false;
                        }
    				}
    
    				if (FD_ISSET(hSocket,&fdsError))
    				{
                        test = WSAGetLastError();
    					bIsConnected = false;
    				}
    			}
    		 }
    
    		// wait
    		Sleep(1);
    	}
    

    fürs senden benutze ich diesen Code

    if (bIsConnected)
    		{
    			if (!(0 < (uwSentBytes = send(hSocket,(const char *)pSendBuffer,uwSendBytes,0))))
                	test = WSAGetLastError();	
    		}
    

    hat jemand eine Idee?



  • Also ich habe die Fehlerhafte Kommunikation mit Wireshark aufgenommen

    Es sind ein paar Retransmissions und ein paar Duplicate ACKs drin. Dort wo der Fehler passiert gibt es von beiden viele aber ich kann nichts Fehlerhaftes erkennen.

    Selbst wenn der PC irgend einen Fehler erkennt müßte er doch zumindest die Verbindung schließen. Denn bei Fehler mach ich closesocket aber das sehe ich auch nicht auf dem Trace.

    Wie kann ich bei diesem Trace rausfinden ob er korrekt war oder irgendwo ein Fehler aufgetreten ist?

    Wo kann ich mir dazu Informationen holen wie ich diesen Trace auseinander nehme?



  • so ich habe mich jetzt noch mal mit dem Trace beschäftigt.

    Auf dem Trace ist zu sehen das zwei Pakete (eines von jedem Client, die auf dem selben rechner sind) nicht durch den server angenommen werden und deshalb 5 mal versucht wird diese zu übertragen.

    Nachdem das Timout für das 5 te Paket abgelaufen ist. Bekomme ich den Fehler WSACONNRESET auf beiden Clienten. Nur leider haben die Clienten kein reset paket geschickt. Die Clienten führen daraufhin nochmal ein closesocket aus. Aber auch da wird kein FIN Packet geschickt.

    Der Server denkt natürlich das die Verbindung noch besteht und sendet erstmal weitere Pakete.

    Warum wird die Verbindung nicht korrekt durch ein Verbindungsende Paket (RST oder FIN) vom Client getrennt?



  • Wenn ich diesen Gedanken weiter gehe:

    Also der Client konnte ein Packet nicht senden, dann müßte er ja eine Fehlermeldung generieren. Nur wie komme ich an die ran, denn die Funktion send liefert ja nur Fehler wenn die Daten nicht in den Sendepuffer geschrieben werden konnten.

    Die Funktion read liefert WSAECONNRESET weil der Sendefehler vorrausgegangen ist wie kann ich nun den Fehler abfangen an der richtigen stelle?


Anmelden zum Antworten