TClientSocket hält einfach beim Lesen an
-
Hallo zusammen,
ich habe ein Problem mit einem TClientSocket. Und zwar springt mein C-Builder6 ins CPU-Fenster und bleibt auf der return Zeile eines Breakpoints stehen. Allerdings habe ich diesen Breakpoint nie gesetzt. Ich kann ihn folglich auch nicht löschen. Der Fehler tritt nur beim Lesen auf.Kann mir da jemand helfen?
Danke schonmal
basedow
-
Seit wann haben Breakpoints (return)Zeilen? Fehlermeldungen? exceptions? Alle Zeiger korrekt?
ergötze uns doch bitte an ein paar weiteren Details...
-junix
-
Also, weil ich nicht weiss wie man ein Bild hier ins Forum kriegt, tipp ichs mal aus dem CPU-Fenster ab:
...
ntdll.DbgBreakPoint:
778A144B int 3
-> 778A144C ret
...Da wo der Pfeil (->) ist steht der Debugger. Und wenn mich nicht alles täuscht ist die Zeile darüber der Processor Hook für nen Breakpoint oder?
-
Riecht stark nach kaputtem Code.... Zeig mal deine Funktion und die Zeile in welcher das dann auftritt.
-junix
-
void __fastcall TPRuntimeDataDistributor::TPRuntimeDataDistributorRead(TObject* Sender, TCustomWinSocket* Socket) { //while(ReadSocketData()); int bytesAvailable = Socket->ReceiveLength(); SPProfiLabProtocolMessage* header = (SPProfiLabProtocolMessage*)headerBuffer; if(bytesAvailable > 0) { while(bytesAvailable > 0) { if(headerBytesReceived < HEADER_SIZE) { if((HEADER_SIZE - headerBytesReceived) > bytesAvailable) { headerBytesReceived += Socket->ReceiveBuf(&headerBuffer[headerBytesReceived], bytesAvailable); bytesAvailable = 0; } else { // bytesAvailable vor dem lesen verringern... bytesAvailable -= HEADER_SIZE - headerBytesReceived; // lesen... headerBytesReceived += Socket->ReceiveBuf(&headerBuffer[headerBytesReceived], HEADER_SIZE - headerBytesReceived); // Länge der Nachricht auslesen... unsigned long dataLength = header->dataLength; // <- BigEndian Common::SwapL(dataLength); if(dataBuffer) { dataBuffer->Clear(); } else { dataBuffer = new TMemoryStream(); } dataBuffer->SetSize((int)dataLength + HEADER_SIZE); // Header in den Stream... dataBuffer->Position = 0; dataBuffer->Write(headerBuffer, HEADER_SIZE); } } else { // Länge der Nachricht auslesen... unsigned long dataLength = header->dataLength; // <- BigEndian!!! Common::SwapL(dataLength); if((int)(dataLength - dataBytesReceived) > bytesAvailable) { // Rest in den Stream... char* dataBufferMemory = (char*)(dataBuffer->Memory); dataBytesReceived += Socket->ReceiveBuf(&dataBufferMemory[(int)(dataBuffer->Position)], bytesAvailable); dataBuffer->Position += bytesAvailable; bytesAvailable = 0; } else { char* dataBufferMemory = (char*)(dataBuffer->Memory); bytesAvailable -= (int)dataLength - dataBytesReceived; dataBytesReceived += Socket->ReceiveBuf(&dataBufferMemory[(int)(dataBuffer->Position)], (int)dataLength - dataBytesReceived); // dataBuffer ausgeben... AnsiString bufferString = ""; byte* byteBuffer = (byte*)dataBuffer->Memory; for(int i = 0; i < dataBuffer->Size; i++) { bufferString = bufferString + (byte)(*(byteBuffer + i)) + " "; } LOGDEBUG("Bytes in Buffer: " + bufferString); // Checksum prüfen... SPProfiLabProtocolMessage* message = (SPProfiLabProtocolMessage*)dataBufferMemory; unsigned short tempChecksum = message->checksum; unsigned short checksum = message->checksum; // <- BigEndian!!! Common::SwapW(checksum); message->checksum = 0; unsigned short computedChecksum = crc16(message, (int)dataLength + HEADER_SIZE); message->checksum = tempChecksum; if(checksum == computedChecksum) { LOGDEBUG("Checksum ok... received:" + IntToStr(checksum) + " computed:" + IntToStr(computedChecksum)); // Neues Message-Objekt anlegen... TPMessage* newMessage = new TPMessage(this, dataBuffer); // Message verarbeiten... if(ProcessMessage(newMessage)) { TMemoryStream* returnStream = new TMemoryStream(*(newMessage->GetStream())); if(returnStream) { bool result = Socket->SendStream(returnStream); if(result) { delete newMessage; } } else { delete newMessage; } } else { LOGDEBUG("FEHLER: ProcessMessage fehlgeschlagen!!!"); delete newMessage; } } else { LOGDEBUG("Checksum incorrect... received:" + IntToStr(checksum) + " computed:" + IntToStr(computedChecksum)); } headerBytesReceived = 0; dataBytesReceived = 0; } } } } else { //Socket->Read(0); recv(clientSocket->Socket->SocketHandle, NULL, 0, 0); } }
-
Mh, ja
1. Die Funktion ist unübersichtlich und heillos überladen. -> KLeinere, spezialisiertere Funktionen dienen der Übersichtlichkeit
2. Wo ist denn nu der Fehler passiert (zeile?)-junix
-
Die Funktion ist der LeseCallback von dem ClientSocket.
Und der Breakpoint wird angesprungen, wenn die Funktion aufgerufen wird.
Also wenn die Socket sagt, dass Daten verfügbar sind.
-
Aber ein Teil des Callbacks wird doch sicher vorher ausgeführt? Was passiert, wenn du einfach wieder das Programm weiterlaufen lässt?
-junix
-
In der Zeile
dataBuffer->Clear();
Vielleicht ist es auch ein Problem mit TMemoryStream
dataBuffer ist nämlich so einer.
-
Hat sich erledigt
Ich weiss zwar nicht wieso, aber ich hab jetzt einfach nen neuen TMemoryStream angelegt anstatt die Funktion TMemoryStream::Clear() aufzurufen.
Ist aber trotzdem dehr seltsam - oder???
Vielen Dank trotzdem
basedow