Ahhhh, @sergioms, are you a fellow compatriot? (I'm brazillian!)... I've notice your code is writen in portuguese!

Well... First: Notice recv() will return 0 for a stream blocking socket (TCP) only if the connection is shutdown (not if there is no more data to be read... And recv() can receive "pieces" of the data (that's why it returns a 'size'). Your loop should be something like this (it may contain errors... this is only an example):
Code:
...
char buffer[MAX_BUFFER];
char *p;  // will point to buffer position where data will be writen.
ssize_t ret_size, // returned size fromrecv().
        size;  // accumulated size of data received.

size = 0;
p = buffer; // points to the begining of the buffer.

// Tries to read MAX_BUFFER bytes from socket.
while ( size < MAX_BUFFER)
{
  // fd is our stream socket file descriptor.
  if ( ( ret_size = (ssize_t)recv( fd, p, MAX_BUFFER - size, 0 ) ) <= 0 )
  {
    // handle error (ret_size = -1) or shutdown (ret_size = 0) here.
    ...
  }

  // Update size and advances p.
  size += ret_size;
  p += size;
}
...
Suppose that the receive queue is really small (1 KiB, for example) and you are trying to read 4100 bytes... Each round recv() could return 1024 and the last block would be 4 bytes long (4*1024+4 = 4100). So, 5 rounds!

In the routine above, recv() may still block, waiting for another "piece" of data.

Second: Since you are copying just the data received on your messagemRecebida buffer to args.arg1Dados buffer, why you need to fill the former with zeros? And since both have the same total size, there is no boundary issues. Why use that for loop to copy the buffer contents? This should be enough:
Code:
memcpy( args.arg1Dados, menssagemRecebida, args.arg2readSize = size );
Third: There is no way to solve your problem without knowing the scope of your "receive" routine and its variables. If that secondary thread is started inside a function which lost scope as soon as you are zeroing messagemRecebida buffer and args is allocated on stack, then the thread could be dealing with a pointer to a region on the stack which is no longer valid (hence the garbage).