![]() |
|
|
google unix.com
|
|||||||
| Fórumok | Regisztráció | Fórum Szabályok | Linkek | Albumok | GYIK | Tagok listája | Naptár | Keres | Mai hozzászólások | Megjelöl Fórumok Olvas |
| 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 |
![]() |
|
|
LinkBack | Téma eszközök | Keresés a téma | Rate Thread | Megjelenítési módok |
|
|
|
||||
|
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);
}
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);
}
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 |
|
||||
|
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 |
|
||||
|
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.. |
![]() |
| Könyvjelzõk |
| Téma eszközök | Keresés a téma |
| Megjelenítési módok | Rate this thread |
|
|