Salve ragazzi ho un problema e non riesco a venirne a capo.

L'applicazione è un server che riceve connessioni da vari client

Il client stabilita la connessione invia una serie di caratteri (il proprio nome)

Il server legge il nome del client, ricava il relativo ip e inserisce queste informazioni in una lista.

Il problema è che la lista non si popola in maniera corretta:
in particolare il primo elemento è inserito bene (beh, è il primo ), quando inserisce il secondo e stampo la lista mi fa vedere 2 elementi con gli stessi attributi, come se ci fosse stata una sorta di sovrascrittura.
I successivi (al secondo) elementi mi mantengono la lista fissa a 2 elementi con attributi identici (gli stessi dell'ultimo elemento inserito).

Vi riporto le funzioni, le quali vengono chiamate secondo l'ordine riportato

codice:
[...]
/*Il server si mette in ascolto */ 
while(keepAlive){
	if((acceptedSocket=accept(sd,(struct sockaddr *)NULL,NULL))<0){
		#ifdef DEBUF
		perror("errore in accept\n");
		#endif
		exit(-1);
	}
	else{
		#ifdef DEBUG
		printf("il server ha accettato una connessione\n");
		fflush(stdout);
		#endif
		readName(acceptedSocket);
		
	}
	fflush(stdout);
	}
}
codice:
void readName(int socketID)
{
		char a;
		char buffer[MAXSIZE];
		int i=0;
		while(read(socketID,&a,1) > 0){
			if(a!='!')
				buffer[i++]=a;
			else
				break;
		}
		buffer[i]='\0';
		fflush(stdout);
		iP = getPeerIP(socketID);	
		//sendList(socketID);
		insertPeerToList(iP, buffer);
		
	
}
codice:
void insertPeerToList(char *iP, char *name){
	PEERPTR newPeer= malloc(sizeof(PEER));
	newPeer->nome=name;
	newPeer->ip= iP;
	
	PEERPTR temp;
	temp = firstElement;
	if(temp!=NULL){
		while(temp->next != NULL)
			temp=temp->next;	
		temp->next=newPeer;
	}
	else
	firstElement=newPeer;
	printList();
}
Premetto che se l'inserimento lo faccio a mano: chiamando la funzione insertPeerToList con elementi creati da me, funziona tutto alla perfezione.

Ringrazio tutti in anticipo per qualsiasi tipo di aiuto.
Grazie