Fehlermeldung Damage????



  • Hallo,

    ich habe ein Server/Client Programm unter MFC geschrieben. Der Server dient dazu auf eine Datenbank zuzugreifen und bestimmte Daten zu vergleichen , zu speichern oder zu holen. Der Client sendet immer die Befehle die der Server ausführen soll.
    Ich habe z.B. einen Login. Wenn ich diesen ausführe, werden die Daten richtig übertragen und richtig konrolliert. Es werden sogar die richtigen Daten wieder zurück geschickt. Nur dann passiert etwas was ich mir nicht erklären kann.
    Ich bekomme eine Fehlermeldung:

    Debug Error
    Programm: ..........................\server.exe
    DAMAGE: after Number block (#395) at 0x00442810
    

    Der code dazu sieht folgendermaßen aus:

    ///////////////////////////////////////////////////////////////////////////////
    // ClientThread
    unsigned WINAPI ClientThread(LPVOID threadInfo)
    {
    	// this structure will contain all the data this callback will work on
        ssmcClientThreadData* clientData = (ssmcClientThreadData*)threadInfo;
    	if (clientData == NULL)
    	{
    		TRACE(_T("ERROR - clientData is NULL\n"));
    		ASSERT(FALSE);
    		return 0;
    	}
    
    	// get the client connection: receiving messages from client and
    	// sending messages to the client will all be done by using
    	// this client connection
    	ssmcTcpSocket* clientConnection = clientData->getClientConnect();
    	if (clientConnection == NULL)
    	{
    	TRACE(_T("ERROR - clientConnection is NULL\n"));
    		ASSERT(FALSE);
    		return 0;
    	}
    
    	CString clientName = clientData->getHostName();
    	LOG(CXListBox::Blue, CXListBox::White, 0,
    		_T("Starting ClientThread for %s"),
    		clientName.Left(clientName.GetLength()-9));
    
    	// the server is communicating with this client here
    	while (1)// am Ende der Schleife kommt der Fehler
    	{
    		CString messageFromClient = _T("");
    
    		// receive from the client
    
    		BYTE buf[MAX_RECV_LEN*2];
    		buf[0] = 0;
    		buf[1] = 0;
    
            int numBytes = clientConnection->receiveMessage(buf, sizeof(buf));
    		if (numBytes == -99)
    		{
    			TRACE(_T("receiveMessage returned -99\n"));
    
    			LOG(CXListBox::Black, CXListBox::White, 0,
    				_T("receiveMessage returned -99 for %s"), clientName);
    
    			break;
    		}
    
    		int index = 0;
    		BOOL bClientIsUnicode = FALSE;
    		if (buf[0] == 0xFF && buf[1] == 0xFE)
    		{
    			// client is Unicode
    			bClientIsUnicode = TRUE;
    		}
    
    		TCHAR buf2[MAX_RECV_LEN];
    
    #ifdef UNICODE	///////////////////////////////////////////////////////////////
    
    		// server is Unicode
    
    		if (bClientIsUnicode)
    		{
    			// client is Unicode
    			index = 2;
    		}
    		else
    		{
    			// client is ANSI - convert ANSI to Unicode
    
    			MultiByteToWideChar(CP_ACP, 0, (LPCSTR)buf, -1, buf2,
    				_countof(buf2));
    			memcpy(buf, buf2, (_tcslen(buf2)+1)*sizeof(TCHAR));
    		}
    
    #else			///////////////////////////////////////////////////////////////
    
    		// server is ANSI
    
    		if (bClientIsUnicode)
    		{
    			// client is Unicode - convert Unicode to ANSI
    
    			char * cp = (char *) &buf[2];	// skip BOM
    
    			WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)cp, -1, buf2,
    				sizeof(buf2), NULL, NULL);
    
    			memcpy(buf, buf2, strlen(buf2)+1);
    		}
    		else
    		{
    			// client is ANSI
    		}
    
    #endif			///////////////////////////////////////////////////////////////
    
    		messageFromClient = (TCHAR *) (&buf[index]);
    
    		// Client data will be write into the Database
    
    		CDatabaseAccess Database;
    		std::string resultMessage;
    		std::string DataInfo;
    
    		std::vector< std::string > parameters = StringHelper::split( LPCTSTR(messageFromClient), ';' );
    
    		if(parameters.size() > 0)
    		{
    			DataInfo = parameters[0];
    		}
    
    		if( DataInfo == "Login")
    			{		
    				std::string userName = parameters[1];
    				std::string password = parameters[2];
    
    				resultMessage = Database.controlLogin( userName , password );
    
    				clientConnection->sendMessage(resultMessage.c_str());
    			}
    		else if(DataInfo == "Leasing")
    		{
    			resultMessage = Database.storeClientData( LPCTSTR( messageFromClient ));
    		}
    		else
    		{
    			resultMessage = "false";
    		}
         }// Das ist das Ende der Schleife hier springt er raus und gibt die               
          //Fehlermeldung
    
            clientData->SetClientFinished(true);
    
    	LOG(CXListBox::Blue, CXListBox::White, 0,
    		_T("Exiting ClientThread for %s"), clientName);
    
    	return 1;
    }
    

    Wenn Ihr noch anderen Code zur Lösung braucht sagt bescheid.

    Danke Silver



  • Oh habe den Fehler nach intensiver suche und nem bisschen Glück selbst gefunden. Ich habe in einer anderen Methode unbewusst meinem buffer der die anzahl der zu versendenen Zeichen angibt, an eine Stelle die es im Buffer gar nicht gibt versucht einen wert zu setzen. Das kann natürlich nicht funktionieren.


Anmelden zum Antworten