The UNIX and Linux Forums  

Go Back   UNIX og Linux Forums > Særlige Forums > IP Networking
.
google unix.com



IP Networking Lær TCP / IP Internet Protocol, Routing, routere, Network protokoller i dette UNIX og Linux forum.

Mere UNIX og Linux Forum Emner du måske kan finde Helpful
Tråd Thread Starter Forum Svar Last Post
Problem med hukommelsesfejl kshk123 HP-UX 2 05-25-2009 08:01 AM
hukommelsesfejl problem sonali Højtstående Programmering 5 05-25-2009 07:55 AM
Hukommelsesfejl i pthread mindTeaser UNIX for Advanced & Ekspertsøgning Brugere 4 05-18-2009 02:30 AM
Hukommelsesfejl af fork () whererush Højtstående Programmering 7 05-11-2006 12:51 PM
om virtuel hukommelse og hukommelsesfejl shriashishpatil Højtstående Programmering 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 Søg denne tråd Rate Thread Display Modes
  #1 (permalink)  
Old 07-16-2005
lenna lenna is offline
Registreret Bruger
  
 

Join Date: Jul 2005
Stillinger: 3
hukommelsesfejl?

Hi All,

min klient-server-program kan arbejde i to tilstande:
1) en retning - kun klienten sender beskeder til serveren
2) to retninger - server giver svar "til kunden.

når programmet kører i første tilstand, det ser OK ud, men når serveren svar til kunden end kundens ansøgning forlade sin drift efter et kort stykke tid. Jeg forsøger at finde problemet, men har nogle taugh tid.

dette er den funktion, der læser data i klientsiden (som jeg har problemer):



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

efter buffer (decodeUnifiedMsgForServer) er besat af funktionen ovenfor jeg afkode data til de relevante data klasser som følger:



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 første 3 bytes i bufferen er heltal (generelle data, såsom - alt len, msgid osv.), og jeg afkode dem i 2. funktion. jeg bagefter sende buffer i specifikke data klasser, at afkode de relevante data, de har brug for hjælp af fuction decodeMsg.

mine spørgsmål er som følger:

1) Hvorfor er længden af buffer (decodeUnifiedMsgForServer) er altid 0 og ikke svarer til længden af den msg modtaget fra serveren? Jeg ved, at de data, der modtages fra serveren, fordi det er logget korrekt, men når jeg kontrollerer længden af msg det equas 0 (første "hvis" i anden funktion) - nogen ideer?

2) når jeg bemærkede den linje, der kalder decodeMsg ansøgningen "opførte sig 'OK, og klienten ikke forlade sin drift. Jeg tror, at denne fejl har noget at gøre med memory leak. måske hvis jeg har forstået det første spørgsmål, jeg kunne forstå denne her også.

Tusind tak for din hjælp,
Lenna
  #2 (permalink)  
Old 07-16-2005
lenna lenna is offline
Registreret Bruger
  
 

Join Date: Jul 2005
Stillinger: 3
godt, jeg ikke kender svaret på det første spørgsmål, men jeg nok fundet ud af svaret til seconf en. grunden til, at programmet fik skøre er, at eftersom det er multi threading er der en situation, hvor en begivenhed er rejst, og som forårsager, at systemet flipper ud. Jeg har stadig ikke fundet, hvorfor den freaks ud, men hvis jeg forhindre begivenheden, der skal rejses end skovhugst er OK, og klient applikation ikke forlade sin drift.

Jeg vil blive glad for selv, hvis nogen kunne besvare mit første spørgsmål ovenfor - hvorfor er længden af buffer \u003d 0? kunne det være fordi jeg bruger memcpy i min kode / afkode buffer funktioner?

Tak igen,
Lenna
  #3 (permalink)  
Old 05-25-2009
ogerassimov ogerassimov is offline
Registreret Bruger
  
 

Join Date: May 2009
Stillinger: 4
Brug Debugger ...

Hej Lenna,

Det er et komplekst program, og de problemer, der kunne være på forskellige steder, så brug debugger til at undersøge den præcise årsag. Men jeg har lavet noget kode bemærkninger:

1. Om "TCPClient:: readSocketData"
hvis den eksterne side lukker soklen til at skrive (shutdown stikket) eller lukker den.
derefter funktionen "recv" giver 0

se man recv
"Afkastet er værdien 0, når peer har udført en ordentlig lukning."

Denne metode vil ud på den anden tilbage, fordi "br" vil være 0 og afkastet værdien 0. Så vil Alle data i bufferen ikke rørt ved alle.

Jeg vil også anbefale dig at bruge errno og # include <errno. h> for at tjekke fejl efter hver fejlbehæftet system opkald. Jeg recomment dig til at tjekke fejl.

2. Har i tankerne, at hvis du tester både klient og server på samme maskine (localhost) forlader klienten med uafsluttede socket får serveren til at modtage SIG_PIPE signal. Så jeg anbefale dig at blokere for, at signalet på serveren.

3. Metoden "BrainControlComData:: decodeMsg (char * decodeUnifiedMsgForServer)" har ingen idé om buffer længde.

char * er en pointer til en byte eller byte sekvens

Jeg recomment dig til at ændre denne erklæring

BrainControlComData:: decodeMsg (const char * decodeUnifiedMsgForServer, size_t størrelse)

Det er grunden til disse linjer ser mærkeligt ud:

if (strlen (decodeUnifiedMsgForServer) \u003d\u003d 0)
(
char * error \u003d "sandsynligvis en fejl (se nedenfor Q1)";
)


Jeg formoder, at decodeMsg simpelthen ikke får den buffer med korrekte længde, og det gør ikke nogen kontrol over den korrekte længde. Det forudsætter, at alt er OK, og når det er ikke sandt, du får mærkelige resultater.

Den memcpy er ikke nødvendig
int Web_lenOfClass;
/ / Afkode len af msg
memcpy (& Web_lenOfClass, msg, size);
int lenOfClass \u003d ntohl (Web_lenOfClass);


Du kan erstatte det med:
int lenOfClass \u003d ntohl (* (uint32_t *) msg);

og også
int msgid \u003d ntohl (* (uint32_t *) (msg + MSG_ID_LOCATION));


4. Hvis du har tid, vil jeg anbefale dig at oprette enhed test (test i isolation) om hver vigtig klasse / metoder. Og for at se dem mere grundigt. Flere forsøg med mere præcise tests.


Venlig hilsen
O.

Senest redigeret af ogerassimov; 05-25-2009 kl 02:03 PM..
Closed Thread

Bogmærker

Thread Tools Søg denne tråd
Søg denne tråd:

Avanceret søgning
Display Modes Bedøm denne tråd
Bedøm denne tråd:

Udstationering Regler
Du kan ikke post nye tråde
Du kan ikke post svar
Du kan ikke post vedhæftede filer
Du kan ikke redigere dine indlæg

BB-kode er
Smilies er
[IMG] koden er
HTML-koden er Slukket
Trackbacks er
Pingbacks er
Refbacks er




Alle tidspunkter er GMT -4. Den tid er nu 12:04 AM.


Powered by: vBulletin, Copyright © 2000 - 2006, Jelsoft Enterprises Limited. Oversættelser Powered by .
vBCredits v1.4 Copyright © 2007 - 2008, PixelFX Studios
UNIX og Linux Forums Content Copyright © 1993-2009. Alle rettigheder Reserved.Ad Management ved RedTyger

Content Relevant webadresser ved vBSEO 3.2.0