![]() |
Hallo und herzlich Willkommen aus den Vereinigten Staaten, die UNIX-und Linux-Foren! Vielen Dank für Ihren Besuch und die Teilnahme an unserem Global Community.
|
|
Google unix.com
|
|||||||
| Foren | Registrieren | Forum-Regeln | Links | Alben | FAQ | Benutzerliste | Kalender | Suche | Die heutige Beiträge | Alle Foren als gelesen markieren |
| IP-Networking Erfahren Sie TCP / IP, Internet Protocol, Routing, Router, Netzwerk-Protokolle in UNIX-und Linux-Forum. |
Mehr UNIX-und Linux-Forum Themen Vielleicht finden Sie hilfreiche
|
||||
| Faden | Thread Starter | Forum | Antworten | Last Post |
| Problem mit Speicherverlust | kshk123 | HP-UX | 2 | 05-25-2009 07:01 AM |
| Speicherverlust Problem | Sonali | High-Level-Programmierung | 5 | 05-25-2009 06:55 AM |
| Speicherverlust in pthread | mindTeaser | UNIX für Fortgeschrittene und Experten | 4 | 05-18-2009 01:30 AM |
| Speicherverlust von fork () | whererush | High-Level-Programmierung | 7 | 05-11-2006 11:51 AM |
| Über den virtuellen Speicher und Speicher-Lecks | shriashishpatil | High-Level-Programmierung | 4 | 02-20-2006 11:31 AM |
![]() |
|
|
LinkBack | Thread Tools | Suche diesen Thread | Rate Thread | Anzeige-Modi |
|
|
|
||||
|
Speicherleck?
Hi All,
Mein Client-Server-Anwendung kann in zwei Modi: 1) eine Richtung - nur Client sendet an den Server-Mitteil 2) zwei Richtungen - Server "Antworten" auf dem Client. Programm ausführen, wenn in den ersten Modus sieht es OK, aber wenn Antworten auf Client-Server als Client-Anwendung verlassen den Betrieb nach kurzer Zeit. Ich versuche das Problem zu finden, haben aber einige taugh Zeit. Dies ist die Funktion, liest die Daten in der Client-Seite (in denen ich Probleme haben): Code:
int TCPClient::readSocketData(int s,
char *decodeUnifiedMsgForServer,
int n,
bool& isMsg
)
{
int bcount; int br;
bcount = 0;
br = 0;
while (bcount < n)
{
if ((br = recv(s,decodeUnifiedMsgForServer,n-bcount,0)) > 0)
{
isMsg = true;
bcount += br; decodeUnifiedMsgForServer+= br;
}
else if (br < 0) /* signal an error to the caller */
{
return(-1);
}
else {
return bcount;
}
//Y 17_04_05 -
Sleep(0);
//Y.
}
return(bcount);
}
Code:
void BrainControlComData::decodeMsg(char* decodeUnifiedMsgForServer)
{
if(strlen(decodeUnifiedMsgForServer) == 0)
{
char* error = "probably an error (see Q1 below)";
}
char* msg = decodeUnifiedMsgForServer;
int size = 4;
int lenCursorData;
int lenManipData;
int lenVzData;
//places 1 - 12 in msg are reserved for total size/ isEventMsg/ MsgID
int Web_lenOfClass;
// decode len of msg
memcpy(&Web_lenOfClass, msg, size);
int lenOfClass = ntohl(Web_lenOfClass);
int Web_MsgID;
// decode msg ID
memcpy(&Web_MsgID, msg + MSG_ID_LOCATION, size);
int msgID = ntohl(Web_MsgID);
//Y 6_07_05 -
int counter = 12;
int len = 0;
len = comData[CURSOR_DATA]->decodeMsg(msg + counter);
counter += len;
len = comData[STATE_DATA]->decodeMsg(msg);
}
Meine Fragen sind wie folgt: 1) Warum ist die Länge des Puffers (decodeUnifiedMsgForServer) ist immer 0 und nicht gleich auf die Länge der MSG, die von Server? Ich weiß, dass die Daten von dem Server, weil es richtig eingeloggt, aber immer noch, wenn ich Länge von msg es equas 0 (erste "wenn" in der zweiten Funktion) - irgendwelche Ideen? 2), als ich bemerkte, dass die Zeile ruft die decodeMsg die Anwendung "verhalten" OK "und Kunden nicht verlassen werden können. Ich denke, dass dieser Fehler hat etwas zu tun mit Speicherverlust. vielleicht wenn ich die erste Frage, die ich verstehen konnte diese als gut. Vielen Dank für Ihre Hilfe, Lenna |
|
||||
|
gut, ich weiß nicht, die Antwort auf die erste Frage, aber ich wahrscheinlich finden Sie die Antwort für die seconf ein. der Grund, warum das Programm erhielt verrückt ist, dass, da es Multi Threading gibt es eine Situation, in der ein Ereignis auf, die dazu führen, dass das System zum ausflippen. Ich habe immer noch nicht gefunden, warum es Freaks, sondern auch, wenn ich verhindern, dass die Veranstaltung zu erhöhen, als die Anmeldung in Ordnung ist und Client-Anwendung nicht verlassen können.
Ich werde glücklich sein, wenn aber jemand Antwort meiner ersten Frage - Warum ist die Länge von buffer \u003d 0? Könnte es sein, weil ich in meinem memcpy kodieren / dekodieren Puffer Funktionen? Thanks again, Lenna |
|
||||
|
Verwenden Sie Debugger ...
Hallo Lenna,
Es ist ein komplexes Programm, und die Probleme werden an verschiedenen Orten, so Debugger verwenden, um die genaue Ursache. Dennoch habe ich einige Bemerkungen Code: 1. Über "TCPClient:: readSocketData" , wenn der Remote-Seite wird die Buchse für das Schreiben (Herunterfahren des Systems ist der Sockel) oder schließt es. dann die Funktion "recv" 0 zurück siehe man recv "Der Rückgabewert ist 0, wenn die Peer hat eine geordnete Herunterfahren." Diese Methode wird an der zweiten Ausfahrt zurück, weil "Br" ist 0 und der Rückgabewert ist 0. So dass alle Daten in den Puffer werden nicht berührt werden. Ich empfehle Ihnen, errno und # include <errno. h>, um die Fehler nicht nach jedem System Call. Ich empfehlen Ihnen zu überprüfen, Fehler. 2. Haben Sie vergessen, dass, wenn Sie die Prüfung sowohl dem Client und dem Server auf der gleichen Maschine (localhost) Beenden Sie den Client mit unclosed Buchse wird der Server zu erhalten SIG_PIPE Signal. Daher empfehle ich Ihnen zu, dass Block-Signal auf dem Server. 3. Die Methode "BrainControlComData:: decodeMsg (char * decodeUnifiedMsgForServer)" hat keine Ahnung von den Puffer Länge. char * ist ein Zeiger auf ein Byte oder Byte-Sequenz Ich empfehlen Ihnen, diese Erklärung zu BrainControlComData:: decodeMsg (const char * decodeUnifiedMsgForServer, size_t size) Das ist der Grund, warum diese Linien sieht seltsam aus: if (strlen (decodeUnifiedMsgForServer) \u003d\u003d 0) ( char * error \u003d "wahrscheinlich einen Fehler (siehe unten Q1)"; ) Ich nehme an, dass decodeMsg einfach nicht den Puffer mit der richtigen Länge, und es keine Kontrolle über die richtige Länge. Es wird davon ausgegangen, dass alles in Ordnung ist, und wenn dies nicht der Fall erhalten Sie seltsame Ergebnisse. Die memcpy ist nicht erforderlich int Web_lenOfClass; / / Dekodieren len der MSG memcpy (& Web_lenOfClass, msg, size); int lenOfClass \u003d ntohl (Web_lenOfClass); Sie könnten es mit: int lenOfClass \u003d ntohl (* (uint32_t *) msg); und auch int msgid \u003d ntohl (* (uint32_t *) (+ MSG_ID_LOCATION msg)); 4. Wenn Sie Zeit haben, empfehle ich Ihnen, Unit-Tests (Test in Isolation) über jede wichtige Klasse / Methoden. Und zu prüfen, sie sorgfältig. Weitere Tests mit präziser Tests. Mit besten Grüßen O. Zuletzt bearbeitet von ogerassimov; am 05-25-2009 01:03 PM.. |
![]() |
| Lesezeichen |
| Thread Tools | Suche diesen Thread |
| Anzeige-Modi | Rate this thread |
|
|