Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    [C] programmazione server e problematiche memoria

    Devo fare un progetto di un client che richiede una tripla di risorse ad un server. Il server deve principalmente supportare multiconnessioni ed evitare starvation. Il server io l'ho già fatto, ma il mio prof dice che c'è un errore nella gestione della memoria sulla chiamata accept


    codice:
    void *thread_root(void *arg){
     	int temp_sd;
     	int SD = (int) arg;
      	while(1) {	//ciclo infinito 
    		if ((temp_sd= accept(SD, (struct sockaddr *)&client, &address_size))< 0){
    	                printf("Errore nella chiamata ACCEPT\n")
      		        exit(-1);
     		}
      		pthread_t IDthread;
     		int res = pthread_create(&IDthread, NULL, thread_func,  (int *) temp_sd);
    	//creazione nuovo thread per la gestione della connessione
      		if (res != 0) {
         			printf("Creazione thread fallita!!!");
         			exit(0);
     		}else{
     			pthread_mutex_lock(&mutex_counter);
     			sockets_connected++;	//incrementa il contatore dei client connessi
     			pthread_mutex_unlock(&mutex_counter);
     		}
     	}
     }

    Io sinceramente non capisco dove sia il problema. Oltretutto il programma funziona bene.
    Questa funzione che ho postato è il thread che riceve come parametro il socket in ascolto, e chiama thread diversi che gestiscono le singole connessioni. E' un thread unico, non ce ne sono altri identici, a differenza dei vari thread che vengono chiamati a gestire le singole connessioni che sono multipli.

    Se volete il codice del server completo (è un pò lungo) chiedete pure.

    Ringrazio chiunque voglia aiutarmi.

    Il Cozza

  2. #2
    Visto così non sembra che ci siano errori.
    Prova ad utilizzare uno di quei programmi di leak detection, tipo valgrind, e verificare effetivamente la perdità di memoria.
    E magari un po' di unit testing non guasterebbe.


  3. #3
    No, c'è proprio un errore a livello di codice.

    Infatti mi ha tornato a scrivere dicendo che c'è una imprecisione sull'uso della funzione pthread_create, che in qualche modo è legata alla accept.

    immagino che sia colpa di temp_sd. forse il casting (int *) è errato?
    saluti,

    il cozza

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,464
    Mi sbaglio o dovresti scrivere

    int res = pthread_create(&IDthread, NULL, thread_func, (void *) &temp_sd);
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Si, rivedendo la documentazione pthread_create richiede un puntatore e non la variabile stessa... vediamo se era quello.

    comunque in teoria non avrebbe dovuto funzionare.

    Saluti

    il Cozza

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 © 2024 vBulletin Solutions, Inc. All rights reserved.