Visualizzazione dei risultati da 1 a 5 su 5

Discussione: [C] Popolare una lista

  1. #1

    [C] Popolare una lista

    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

  2. #2
    1 .Attenzione mio caro questa funzione è VULNERABILE ad un attacco di BUFFER OVERFLOW, con il quale un ipotetico "malintenzionato" puo eseguire del codice macchina DA REMOTO.
    Quindi correggi per favore

    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);
    		
    	
    }
    2. In questa funzione tutti i *(newPeer).nome PUNTERANNO a name, ma NON CONTERANNO il suo valore, stessa cosa per *(newPeer).ip. Devi USARE la strncpy

    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();
    }
    3. Se firstElement è un puntatore allora:
    codice:
    temp = firstElement;
    è sbagliato, se invece non è un puntatore, allora:
    codice:
    firstElement = newPeer;
    è sbagliato

    4. temp non è un puntatore ...

    codice:
    if(temp!=NULL){
    	while(temp->next != NULL)
    		temp=temp->next;	
    		temp->next=newPeer;
    	}
    }
    Stai attento quando scrivi codice, soprattuto se server-side. Poi mi chiedo come mai il tuo compilatore non ti abbia segnalato certi erroracci


  3. #3

    Re: [C] Popolare una lista

    Originariamente inviato da UnderMaken
    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){
    	...
    	newPeer->nome=name;
    	...
    }
    1. buffer in readName è una variabile locale, e tu assegni il suo indirizzo a newPeer->nome in insertPeerToList. Ma essendo buffer locale a readName, cessa d'esistere all'uscita della funzione readName, quindi all'uscita da readName, newPeer->nome di fatto punta ad una zona di memoria non valida.

    2. Come lo allochi il valore restituito da getPeerIP?
    3. iP a cui assegni il valore restituito da getPeerIP è una variabile globale?

  4. #4

  5. #5
    Grazie ragazzi cerco di fixare tutti gli errori che mi avete elencato, e di prendere spunto dai consigli.
    Grazie ancora

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.