The UNIX and Linux Forums  
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.

Go Back   Die UNIX-und Linux-Foren > Spezielle Foren > IP-Networking
.
Google unix.com



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

Closed Thread
English Japanese Spanish French German Portuguese Italian Dutch Swedish Russian Norwegian Hungarian Hebrew Danish Bulgarian Greek Powered by Powered by Google
 
LinkBack Thread Tools Suche diesen Thread Rate Thread Anzeige-Modi
  #1 (permalink)  
Old 07-16-2005
Lenna lenna is offline
Registrierte Nutzer
  
 

Join Date: Jul 2005
Beiträge: 3
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);
}
nach Puffer (decodeUnifiedMsgForServer) wird durch die Funktion I dekodieren die Daten in die entsprechenden Daten-Klassen wie folgt:


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);
}
die ersten 3 Bytes im Puffer sind Ganzzahlen (allgemeine Daten, wie zB - insgesamt len, msgid etc.) und ich decodieren Sie sie in der 2. Funktion. danach ich den Puffer in die Klassen, die Daten dekodieren die relevanten Daten, die sie müssen mit der Funktion decodeMsg.

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
  #2 (permalink)  
Old 07-16-2005
Lenna lenna is offline
Registrierte Nutzer
  
 

Join Date: Jul 2005
Beiträge: 3
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
  #3 (permalink)  
Old 05-25-2009
ogerassimov ogerassimov is offline
Registrierte Nutzer
  
 

Registriert seit: Mai 2009
Beiträge: 4
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..
Closed Thread

Lesezeichen

Thread Tools Suche diesen Thread
Suche diesen Thread:

Erweiterte Suche
Anzeige-Modi Rate this thread
Rate this thread:

Forumregeln
Du möglicherweise nicht neue Themen
Du möglicherweise nicht nach Antworten
Du möglicherweise nicht post-Anlagen
Du möglicherweise nicht bearbeiten Sie Ihre Beiträge

BB-Code ist Auf
Smilies sind Auf
[IMG] Code Auf
HTML-Code ist Aus
Trackbacks sind Auf
Pingbacks sind Auf
Refbacks sind Auf




Alle Zeiten sind GMT -4. Es ist jetzt 09:42 AM.


Powered by: vBulletin, Copyright © 2000 - 2006, Jelsoft Enterprises Ltd. Sprachliche Übersetzungen Powered by .
vBCredits v1.4 Copyright © 2007 - 2008, PixelFX Studios
Die UNIX-und Linux-Foren Content © Copyright 1993-2009. Alle Rechte Reserved.Ad Management von RedTyger

Content Relevant URLs durch vBSEO 3.2.0