The UNIX and Linux Forums  

Go Back   De Unix-en Linux Forum > Speciale Forums > IP Networking
.
google unix.com



IP Networking Hier TCP / IP, Internet Protocol, Routing, Routers, Netwerk protocollen in dit UNIX-en Linux-forum.

Meer UNIX en Linux Forum Onderwerpen Misschien vindt u Helpful
Draad Thread Starter Forum Antwoorden Last Post
Probleem met geheugenlek kshk123 HP-UX 2 05-25-2009 08:01
geheugenlek probleem sonali Hoog Niveau Programmering 5 05-25-2009 07:55
Geheugenlek in pthread mindTeaser UNIX for Advanced & Expert Gebruikers 4 05-18-2009 02:30
Geheugenlek van fork () whererush Hoog Niveau Programmering 7 05-11-2006 12:51
over het virtuele geheugen en geheugenlek shriashishpatil Hoog Niveau Programmering 4 02-20-2006 11:31

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 Zoeken in deze Thread Rate Thread Display Modes
  #1 (permalink)  
Old 07-16-2005
lenna lenna is offline
Geregistreerde gebruiker
  
 

Join Date: juli 2005
Posten: 3
geheugenlek?

Hi All,

mijn client server applicatie kan werken in twee modi:
1) een richting - alleen client stuurt ber naar de server
2) twee richtingen - server geeft 'antwoorden' aan opdrachtgever.

bij het programma te starten in de eerste modus lijkt het OK, maar als antwoorden op de client-server toepassingen dan de klant afrit de werking ervan na een korte tijd. Ik ben op zoek naar het probleem, maar sommige taugh tijd.

Dit is de functie die de gegevens in de client leest (in die ik heb problemen):



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);
}

na buffer (decodeUnifiedMsgForServer) wordt ingevuld door de functie hierboven ik decoderen van de gegevens in de relevante gegevens klassen als volgt:



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);
}

de eerste 3 bytes in de buffer zijn gehele getallen (algemene gegevens, zoals - totaal len, msgId enz.) en ik decoderen ze in de 2e functie. daarna stuur ik de buffer in specifieke gegevens klassen die decoderen de relevante gegevens die zij nodig hebben met behulp van de fuction decodeMsg.

mijn vragen zijn als volgt:

1) waarom is de lengte van de buffer (decodeUnifiedMsgForServer) is altijd 0 en niet gelijk aan de lengte van de msg ontvangen van server? Ik weet dat de gegevens ontvangen van de server, omdat het goed is aangemeld, maar nog steeds als ik controleer de lengte van het msg equas 0 (eerste "indien" in de tweede functie) - alle ideeën?

2) toen ik merkte de lijn die roept de decodeMsg de aanvraag 'gedragen' OK 'en client didn't exit de werking ervan. Ik denk dat deze fout iets te maken heeft met het geheugen lekken. Misschien als ik begreep de eerste vraag die ik kon begrijpen deze ook.

Hartelijk dank voor uw hulp,
Lenna
  #2 (permalink)  
Old 07-16-2005
lenna lenna is offline
Geregistreerde gebruiker
  
 

Join Date: juli 2005
Posten: 3
Nou, ik weet niet het antwoord op de eerste vraag, maar ik waarschijnlijk gevonden uit het antwoord voor de seconf een. de reden waarom het programma kreeg gekke is dat sinds het multi threading er een situatie waarin een gebeurtenis wordt opgeworpen die het systeem om freak out veroorzaken. Ik heb nog niet hebben gevonden waarom het freaks out, maar als ik voorkomen dat het evenement worden verhoogd dan houtkap is OK en client-toepassing is niet de werking ervan te verlaten.

Ik zal al blij als iemand kon beantwoorden mijn eerste vraag hierboven - waarom is de lengte van de buffer \u003d 0? zou het zijn omdat ik in mijn memcpy coderen / decoderen buffer functies?

Thanks again,
Lenna
  #3 (permalink)  
Old 05-25-2009
ogerassimov ogerassimov is offline
Geregistreerde gebruiker
  
 

Join Date: mei 2009
Posten: 4
Gebruik Debugger ...

Hallo Lenna,

Het is een complexe aanvraag, en de problemen kunnen worden op verschillende plaatsen dus gebruik debugger om de exacte reden te onderzoeken. Toch Ik heb wat code opmerkingen:

1. Over "TCPClient:: readSocketData"
Als de externe kant sluit de socket voor het schrijven van (shutdown de socket) of sluit het.
dan de functie "recv" geeft 0

Zie man recv
"Het rendement waarde 0 wanneer de peer heeft een ordelijke shutdown uitgevoerd."

Deze methode zal verlaten op het tweede terugkeer omdat "br" zal worden 0 en de terugkeer waarde 0. Dus Alle gegevens in de buffer wordt helemaal niet aangeraakt.

Ik heb ook een kijkje op de gebruiken errno en # include <errno. h> de controle van de fout na elke mislukte system call. Ik recomment u om fouten te controleren.

2. In gedachten hebben dat als je zowel de client als de server testen op dezelfde machine (localhost) het verlaten van de cliënt met beëindigde aansluiting zorgt ervoor dat de server te ontvangen SIG_PIPE signaal. Dus ik raden u aan om dat signaal te blokkeren op de server.

3. De methode "BrainControlComData:: decodeMsg (char * decodeUnifiedMsgForServer)" heeft geen idee over de buffer lengte.

char * is een pointer naar een byte of byte volgorde

Ik recomment u om deze verklaring te wijzigen

BrainControlComData:: decodeMsg (const char * decodeUnifiedMsgForServer, size_t grootte)

Dat is waarom deze lijnen ziet er vreemd uit:

if (strlen (decodeUnifiedMsgForServer) \u003d\u003d 0)
(
char * error \u003d "waarschijnlijk een fout (zie hieronder Q1)";
)


Ik veronderstel dat decodeMsg gewoon niet de buffer met de juiste lengte te krijgen, En het geen enkele controle uit te voeren over de juiste lengte. Het gaat ervan uit dat alles OK is, en wanneer dat niet het geval is krijg je vreemde resultaten.

De memcpy is niet nodig
int Web_lenOfClass;
/ / Decode len van MSG
memcpy (& Web_lenOfClass, msg, grootte);
int lenOfClass \u003d nthol (Web_lenOfClass);


Je zou kunnen vervangen door:
int lenOfClass \u003d ntohl (* (uint32_t *) msg);

en ook
int msgid \u003d ntohl (* (uint32_t *) (msg + MSG_ID_LOCATION));


4. Als je tijd hebt zou ik een kijkje op de unit tests maken (test in isolatie) over elk belangrijk klasse / methoden. En om te controleren ze zorgvuldig. Meer tests met meer nauwkeurige tests.


Met vriendelijke groet
O.

Laatst bewerkt door ogerassimov; op 05.25.2009 02:03 PM..
Closed Thread

Bladwijzers

Thread Tools Zoeken in deze Thread
Zoeken in deze Thread:

Uitgebreid zoeken
Display Modes Beoordeel deze draad
Beoordeel deze draad:

Posting Regels
Jij mag niet Post Nieuwe threads
Jij mag niet na antwoorden
Jij mag niet post attachments
Jij mag niet bewerk uw berichten

BB code is Aan
Smilies zijn Aan
[IMG] code Aan
HTML-code is Uit
Trackbacks zijn Aan
Pingbacks zijn Aan
Refbacks zijn Aan




Alle tijden zijn GMT -4. Het is nu 12:59.


Powered by: vBulletin, Copyright © 2000 - 2006, Jelsoft Enterprises Limited. Vertalingen Powered by .
vBCredits v1.4 Copyright © 2007 - 2008, PixelFX Studios
De Unix-en Linux Forums Copyright © 1993-2009. Alle rechten Reserved.Ad Beheer door RedTyger

Content Relevante URL's door vBSEO 3.2.0