Questo è tutto, a meno di stampe che servono a me per il debugging.codice:#include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <unistd.h> #include <string.h> #include <time.h> #include <sys/types.h> #include <sys/socket.h> #include <sys/un.h> #include <errno.h> #include <netinet/ip.h> #include <netinet/in.h> #include "strutture.h" //--->questa è una mia libreria testata è funzionante void *fun(void *x) { char buftime[26]; int fd = *((int *)x); time_t ora; time (&ora); ctime_r(&ora,buftime); printf("fdclient = %d\n",fd); // if ( (write(fd,buftime,26)) <0) //{ // perror("errore write"); //exit(-1); //} close(fd); return NULL; } int main(int argc, char *argv[]) { int fdserver,j,err; int fdclient; int num =0; struct sockaddr_in indirizzo; //struttura che contiene i dati del server /*Alloco lo spazio per alpiù 20 client */ pthread_t tid[MAX_CLIENT]; //----> MAX_CLIENT è una costante in strutture.h *CREAZIONE DEL SERVER */ struct sockaddr_in indirizzo; indirizzo.sin_family = AF_INET; indirizzo.sin_port = htons(5011); indirizzo.sin_addr.s_addr = htonl(INADDR_ANY); /*socket di comunicazione*/ if ((fdserver=socket(AF_INET,SOCK_STREAM,0)) < 0) { perror("errore socket"); exit(-1); } /*bind*/ if ( bind(fdserver,(struct sockaddr *)&indirizzo,sizeof(indirizzo)) < 0) { perror("errore bind"); exit(-1); } /*Metto il server in ascolto di massimo MAX_CLIENT*/ if (listen(fdserver,MAX_CLIENT)<0) { perror("errore listen"); exit(-1);} while(1) { /*Servono per sapere l'indirizzo del client che si è appena collegato*/ struct sockaddr_in indirizzo_client; socklen_t client_size = sizeof(indirizzo_client); /*accetto la connessione di un nuovo cliente*/ if ((fdclient=accept(fdserver,(struct sockaddr *)&indirizzo_client,&client_size))<0) { perror("errore accept"); exit(-1); } printf("num = %d\n",num); //----->>> CADO QUI /*accettato il client creo un nuovo thread per la gestione concorrente del server*/ if( (err=pthread_create(&tid[num],NULL,fun,(void *)fdclient))!=0) { printf("errore %s\n",strerror(err)); exit(1); } num++; printf("ho creato il thread\n"); }//fine while //-----> Questa parte finale è ancora da sistemare perchè il programma cade prima /*aspetto la chiusura di tutti i thread*/ for (j=0;j<num;j++) { pthread_join(tid[j],NULL); num--; } printf("finito.\n"); free(tid); close(fdserver); exit(0); }
L'ultima cosa che stampa il server è: num = 0;

Rispondi quotando