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.