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);
}
Questo è tutto, a meno di stampe che servono a me per il debugging.
L'ultima cosa che stampa il server è: num = 0;