Ho detto in teoria, non ho detto che dev'essere così.
la read restituisce il numero di caratteri letti per ogni singola lettura e non è detto che alla fine la sommatoria dei vari n sia == k.
Devi aggiungere un'altra variabile.
codice:
int idx=0;
for (k=0;k< add_mess->data_length; k=k+n){
			n = read(newsockfd,&add_mess->dato[k],(unsigned long int)add_mess->data_length - k);
                        idx+=n;	
			//printf("k---> %d--->%d\n",k,n);		
			if (n < 0) error("ERROR reading from socket--add");
			if (n==0) break;
		}
                add_mess->dato[idx]=0;