The UNIX and Linux Forums  

Go Back   A UNIX és Linux Forums > Különleges Fórumok > IP Networking
.
google unix.com



IP Networking Tudjon meg a TCP / IP Internet Protocol, útvonalterv, routerek, hálózati protokollok ezen a UNIX és Linux fórum.

Több, UNIX és Linux fórum témák Ön által talált Hasznos
Szál Thread Starter Fórum Válaszok Utolsó hozzászólás
Probléma a memória szivárgás kshk123 HP-UX 2 05-25-2009 08:01 AM
szivárgásveszélyes memória probléma sonali Magas szintű Programozás 5 05-25-2009 07:55 AM
Memory leak in pthread mindTeaser A UNIX a fejlett és szakértői Felhasználók 4 05-18-2009 02:30 AM
Memória szivárgásveszélyes a fork () whererush Magas szintű Programozás 7 05-11-2006 12:51 PM
mintegy virtuális memória és a memória szivárgás shriashishpatil Magas szintű Programozás 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 Téma eszközök Keresés a téma Rate Thread Megjelenítési módok
  #1 (permalink)  
Old 07-16-2005
lenna lenna is offline
Regisztrált felhasználó
  
 

Join Date: Jul 2005
Hozzászólások: 3
memória szivárgás?

Hi All,

my kliens-szerver alkalmazás működhet két módja van:
1) egy irányban - csak a kliens elküldi a szerver üz
2) két irányban - a kiszolgáló ad "választ" az ügyfélnek.

amikor a program fut, az első módban úgy néz ki OK, de amikor szervert választ az ügyfél, mint ügyfél kérelme kilépés működése után egy rövid ideig. Próbálom megtalálni a problémát, de van néhány taugh idő.

ez a funkció, ami beolvassa az adatokat a kliens oldalon (ahol Problémám van):


Kód:
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);
}
után puffer (decodeUnifiedMsgForServer) ki van töltve a funkció felett én dekódolja az adatokat a megfelelő adatok osztályok a következők:


Kód:
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);
}
Az első 3 bájt a pufferben egész számok (általános adatok, mint például - a teljes len, msgid stb) és én dekódolja őket a 2. funkció. utána küldöm a puffer a konkrét adatok, hogy osztályba dekódolni a vonatkozó adatokat, amelyekre szükségük van használva fuction decodeMsg.

Kérdéseim a következők:

1) miért van hossza a puffer (decodeUnifiedMsgForServer) mindig 0, és nem felel meg a hosszát msg kapott szerver? Tudom, hogy a kapott adatokat a szerver, mert be van jelentkezve helyesen, de ha megnézem, hogy hosszú msg equas 0 (az első "ha" a második funkció) - valami ötleted?

2) mikor jegyezte meg a sort, hogy felhívja a decodeMsg a kérelmet "viselkedett" OK és az ügyfél nem kilép a működését. Úgy gondolom, hogy ez a hiba valami köze a memória szivárgás. Talán, ha jól értettem az első kérdést tudtam megérteni ezt is.

Nagyon köszönöm a segítséget,
Lenna
  #2 (permalink)  
Old 07-16-2005
lenna lenna is offline
Regisztrált felhasználó
  
 

Join Date: Jul 2005
Hozzászólások: 3
Hát, nem tudom a választ az első kérdésre, de talán találtam meg a választ a seconf egy. az ok, amiért a program van őrült, hogy mivel ez multi threading van olyan helyzetben, amikor olyan esemény merül fel, amelyek a rendszer kiborulni. Én még nem találtam, hogy miért őrült meg, de ha tudom megakadályozni, hogy az esemény kell emelni, mint a fakitermelés is OK és az ügyfél kérelme nem kilép a működése.

Boldog leszek, bár ha valaki tudna válaszolni az első kérdésre felett - miért az hosszúságú buffer \u003d 0? is lehetne használni, mert az én memcpy kódolni / dekódolni puffer funkciót?

köszönöm,
Lenna
  #3 (permalink)  
Old 05-25-2009
ogerassimov ogerassimov is offline
Regisztrált felhasználó
  
 

Join Date: May 2009
Hozzászólások: 4
Használja Debugger ...

Hello Lenna,

Ez egy komplex alkalmazás, és a problémák lehetnek különböző helyeken tehát használ debugger, hogy vizsgálja meg a pontos oka. Mindazonáltal Csináltam néhány kód észrevételei:

1. About "TCPClient:: readSocketData"
ha a távoli oldal bezárja a socket írásban (shutdown a foglalat), vagy bezárja azt.
akkor a funkció "recv" értéke 0

lásd man recv
"A visszatérési érték 0 lesz, ha a szakértői hajtott végre rendes shutdown."

Ez a módszer ki fog lépni a második visszatérés, mert "br" 0 lesz, és a visszatérési érték 0 lesz. Tehát minden adata a puffer nem lesz ért egyáltalán.

Azt is javaslom, hogy használd errno és az # include <errno. h>, hogy ellenőrizze a hiba után minden egyes sikertelen hívás rendszer. Én recomment, hogy ellenőrizze a hibákat.

2. Gondolok, hogy ha a vizsgálat mind a kliens és a szerver ugyanazon a gépen (localhost) kikerülni a kliens socket bezárva okozza, hogy a szerver kap SIG_PIPE jel. Szóval azt ajánlom, hogy megakadályozza, hogy a jel a szerveren.

3. A módszer "BrainControlComData:: decodeMsg (char * decodeUnifiedMsgForServer)" fogalma sincs arról a puffer hossza.

char * egy mutató egy bájt vagy bájtsorozat

Én recomment, hogy változtatni az a nyilatkozat, hogy

BrainControlComData:: decodeMsg (const char * decodeUnifiedMsgForServer, size_t méret)

Ez az, amiért ezeket a sorokat furcsán néz ki:

if (strlen (decodeUnifiedMsgForServer) \u003d\u003d 0)
(
char * error \u003d "valószínűleg egy hiba (lásd az alábbi Q1)";
)


Azt hiszem, hogy decodeMsg egyszerűen nem kapja meg a puffer hossza helyes, és nem tesz semmilyen ellenőrzést kapcsolatos helyes hosszát. Azt feltételezi, hogy minden rendben van, és amikor ez nem igaz kapsz furcsa eredmények.

A memcpy nem szükséges
int Web_lenOfClass;
/ / Decode len az msg
memcpy (& Web_lenOfClass, msg, méret);
int lenOfClass \u003d ntohl (Web_lenOfClass);


Lehet a helyébe:
int lenOfClass \u003d ntohl (* (uint32_t *) msg);

és
int msgid \u003d ntohl (* (uint32_t *) (+ MSG_ID_LOCATION msg));


4. Ha van időd azt ajánlom, hogy egységet hozzon létre vizsgálatok (teszt önmagában) körülbelül minden fontos osztály / módszerek. És ellenőrizze azokat figyelmesen. További vizsgálat pontosabb teszteket.


Üdvözlettel
O.

Last edited by ogerassimov; 05-25-2009 at 02:03 PM..
Closed Thread

Könyvjelzõk

Téma eszközök Keresés a téma
Keresés a téma:

Részletes keresés
Megjelenítési módok Rate this thread
Rate this thread:

Posting szabályzat
Ön nem post new threads
Ön nem post válaszok
Ön nem post Csatolmányok
Ön nem szerkeszteni az üzeneteidet

BB kód van Be
Smilies vannak Be
[IMG] kód Be
HTML kód Ki
Trackbacks vannak Be
Pingbacks vannak Be
Refbacks vannak Be




Minden idő GMT -4. Az idő most 09:13 AM.


Powered by: vBulletin, Copyright © 2000 - 2006, Jelsoft Enterprises Limited. Nyelvre lefordítva Powered by .
vBCredits v1.4 Copyright © 2007 - 2008, PixelFX Studios
A UNIX és Linux Fórum Tartalom Copyright © 1993-2009. Minden jog Reserved.Ad menedzsment RedTyger

Content Relevant URLs by vBSEO 3.2.0