Sponsored Content
Full Discussion: memory leak?
Special Forums IP Networking memory leak? Post 302319384 by ogerassimov on Monday 25th of May 2009 06:35:23 AM
Old 05-25-2009
Use Debugger ...

Hello Lenna,

It is a complex application, and the problems could be at different places so use debugger to investigate the exact reason. Nevertheless I've made some code observations:

1. About "TCPClient::readSocketData"
if the remote side closes the socket for writing ( shutdown the socket ) or closes it.
then the function "recv" returns 0

see man recv
"The return value will be 0 when the peer has performed an orderly shutdown."

That method will exit at the second return because "br" will be 0 and the return value will be 0. So Any data at the buffer will be not touched at all.

I also recommend you to use errno and #include <errno.h> to check the error after each failed system call. I recomment you to check errors.

2. Have in mind that if you are testing both the client and the server at the same machine (localhost) exiting the client with unclosed socket causes the server to receive SIG_PIPE signal. So I recommend you to block that signal at the server.

3. The method "BrainControlComData::decodeMsg(char* decodeUnifiedMsgForServer)" has no idea about the buffer length.

char* is a pointer to a byte or byte sequence

I recomment you to change that declaration to

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

That's why these lines looks strange:

if(strlen(decodeUnifiedMsgForServer) == 0)
{
char* error = "probably an error (see Q1 below)";
}


I suppose that decodeMsg simply does not get the buffer with correct length, And it does not make any checks about the correct length. It assumes that everything is OK, and when that is not true you get strange results.

The memcpy is not neccessary
int Web_lenOfClass;
// decode len of msg
memcpy(&Web_lenOfClass, msg, size);
int lenOfClass = ntohl(Web_lenOfClass);


You could replace it with:
int lenOfClass = ntohl( *(uint32_t*)msg );

and also
int msgID = ntohl( *(uint32_t*)(msg + MSG_ID_LOCATION ) );


4. If you have time I would recomend you to create unit tests ( test in isolation ) about each important class/methods. And to check them more carefully. More testing with more precise tests.


Best Regards
O.

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

9 More Discussions You Might Find Interesting

1. Programming

about virtual memory and memory leak

Hi, First of all I appreciate this group very much for its informative discussions and posts. Here is my question. I have one process whose virtual memory size increases linearly from 6MB to 12MB in 20 minutes. Does that mean my process has memory leaks? In what cases does the... (4 Replies)
Discussion started by: shriashishpatil
4 Replies

2. UNIX for Advanced & Expert Users

Check memory leak

I am running c++ code on AIX unix.I have a doubt that my code is using some memory but it is not clearing that.Some time i am getting heap allocation problem.In my code i am not using any malloc,new functions also i am justing using pointers and arrays. Is there any way i can find out if the... (2 Replies)
Discussion started by: ukatru
2 Replies

3. UNIX for Advanced & Expert Users

Memory leak while using pthread_cancel()

I tried to execute a sample pthread program to cancel a newly created one using pthread_cancel(). but using valgrind on my code shows some memory leak. My Code: #include "iostream" #include "unistd.h" #include "pthread.h" #include "signal.h" using namespace std; void handler(int); void*... (4 Replies)
Discussion started by: kcr
4 Replies

4. Programming

Memory LEAK with pthreads

I have this code... #include <stdio.h> #include <iostream> #include <pthread.h> static void* cliente(void *datos); int main() { pthread_attr_t tattr; int ret; size_t size = PTHREAD_STACK_MIN + 0x0100; ret = pthread_attr_init(&tattr); ret =... (8 Replies)
Discussion started by: JEscola
8 Replies

5. UNIX for Advanced & Expert Users

Need to create a memory leak

Hi. This might be a strange request, but does anyone have any idea on a simple shell script that would use more and more memory as it ran? Like a purposeful leak. I want to test the behaviour of an already running program when the machine runs out of memory. Thanks! (4 Replies)
Discussion started by: rebelbuttmunch
4 Replies

6. Programming

memory leak problem

hi all Can any one plz explain me about memory leak problem Thankx (5 Replies)
Discussion started by: sonali
5 Replies

7. Programming

Memory Leak

Hi, I am trying a database server which keeps a B+ plus tree structure and works on it. I am trying to find the memory used/leak while executing this process. I check the memory leak by using ps uax command. When i execute a delete query i am sure that my code frees up the existing... (9 Replies)
Discussion started by: kumaran_5555
9 Replies

8. Red Hat

Memory leak

Hi all I am using RED HAT 5.4, and i am getting memory uses problem. when i use "sync;echo 3 > /proc/sys/vm/drop_cache" command the memory will release after 2,3 hour memory show 95%. pls suggest right way. thanks (37 Replies)
Discussion started by: reply.ravi
37 Replies

9. Programming

Help regarding memory leak in this C program

I have written this code in C which reads a very large collection of text files and does some processing. The problem with this code is that there are memory leaks which I am not able to figure out as to where the problem is. When I run this code, and see the memory usage using top command, then I... (7 Replies)
Discussion started by: shoaibjameel123
7 Replies
RECV(2) 							System Calls Manual							   RECV(2)

NAME
recv, recvfrom, recvmsg - receive a message from a socket SYNOPSIS
#include <sys/types.h> #include <sys/socket.h> cc = recv(s, buf, len, flags) int cc, s; char *buf; int len, flags; cc = recvfrom(s, buf, len, flags, from, fromlen) int cc, s; char *buf; int len, flags; struct sockaddr *from; int *fromlen; cc = recvmsg(s, msg, flags) int cc, s; struct msghdr msg[]; int flags; DESCRIPTION
Recv, recvfrom, and recvmsg are used to receive messages from a socket. The recv call is normally used only on a connected socket (see connect(2)), while recvfrom and recvmsg may be used to receive data on a socket whether it is in a connected state or not. If from is non-zero, the source address of the message is filled in. Fromlen is a value-result parameter, initialized to the size of the buffer associated with from, and modified on return to indicate the actual size of the address stored there. The length of the message is returned in cc. If a message is too long to fit in the supplied buffer, excess bytes may be discarded depending on the type of socket the message is received from (see socket(2)). If no messages are available at the socket, the receive call waits for a message to arrive, unless the socket is nonblocking (see ioctl(2)) in which case a cc of -1 is returned with the external variable errno set to EWOULDBLOCK. The select(2) call may be used to determine when more data arrives. The flags argument to a recv call is formed by or'ing one or more of the values, #define MSG_OOB 0x1 /* process out-of-band data */ #define MSG_PEEK 0x2 /* peek at incoming message */ The recvmsg call uses a msghdr structure to minimize the number of directly supplied parameters. This structure has the following form, as defined in <sys/socket.h>: struct msghdr { caddr_t msg_name; /* optional address */ int msg_namelen; /* size of address */ struct iovec *msg_iov; /* scatter/gather array */ int msg_iovlen; /* # elements in msg_iov */ caddr_t msg_accrights; /* access rights sent/received */ int msg_accrightslen; }; Here msg_name and msg_namelen specify the destination address if the socket is unconnected; msg_name may be given as a null pointer if no names are desired or required. The msg_iov and msg_iovlen describe the scatter gather locations, as described in read(2). A buffer to receive any access rights sent along with the message is specified in msg_accrights, which has length msg_accrightslen. Access rights are currently limited to file descriptors, which each occupy the size of an int. RETURN VALUE
These calls return the number of bytes received, or -1 if an error occurred. ERRORS
The calls fail if: [EBADF] The argument s is an invalid descriptor. [ENOTSOCK] The argument s is not a socket. [EWOULDBLOCK] The socket is marked non-blocking and the receive operation would block. [EINTR] The receive was interrupted by delivery of a signal before any data was available for the receive. [EFAULT] The data was specified to be received into a non-existent or protected part of the process address space. SEE ALSO
fcntl(2), read(2), send(2), select(2), getsockopt(2), socket(2) 4.2 Berkeley Distribution May 23, 1986 RECV(2)
All times are GMT -4. The time now is 01:36 AM.
Unix & Linux Forums Content Copyright 1993-2022. All Rights Reserved.
Privacy Policy