Salve ragazzi,
devo realizzare una chat e per gestire le connessioni multiple devo utilizzare i thread. Purtroppo sono un novizio dei threads e mi capita che la funzione che dovrebbe svolgere ciascun thread non è realizzata. Vi allego server.c per farvi capire meglio il problema e l'eventuale errore. nOn ho problemi con i clients.
Ragazzi vi prego aiutatemi.

#include <sys/types.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <netinet/in.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <signal.h>
#include <pthread.h>
#define PORTNUM 15000
#define MAX_NUM_CLIENTS 50

void fireman()
{
union wait wstatus;
while(wait3(&wstatus,WNOHANG,NULL)>0);
}

int crea_socket(int porta)
{
int sock_id;
struct sockaddr_in addr;

if( (sock_id=socket(AF_INET,SOCK_STREAM,0))<0 )
{
perror("Errore nella creazione del socket");
printf("\n\nTerminazione\n");
exit(-1);
}
memset((void *)&addr,0,sizeof(addr));
addr.sin_family=AF_INET;
addr.sin_addr.s_addr=INADDR_ANY;
addr.sin_port=htons(porta);

if(bind(sock_id,(struct sockaddr *)&addr,sizeof(addr)))
{
perror("Errore di Binding");
printf("\n\nTerminazione\n");
exit(-1);
}

if(listen(sock_id,MAX_NUM_CLIENTS)<0)
{
perror("Errore di listening");
printf("\n\nTerminazione\n");
exit(-1);
}

return sock_id;
}

ssize_t leggi(int desc, void *buf, size_t count)
{
size_t nsin;
ssize_t nread;

nsin=count;
while(nsin>0)
{
if( (nread=read(desc, buf, nsin))<0 )
{
if(errno==EINTR)
{
continue;
}
else
{
return(nread);
}
}
else if (nread==0)
{
break;
}
nsin=nsin-nread;
buf=buf+nread;
}
return (count-nsin);
}
struct thread_data {
int thread_id;
int sock_id;
};

struct thread_data thread_buf[MAX_NUM_CLIENTS];

void *servi(void *thread_arg)
{
struct thread_data *mydata;
mydata=(struct thread_data *) thread_arg;
int thread_id=mydata->thread_id;
int sock_id=mydata->sock_id;
int newsock_id;
int exit_cond=0;
int letti;
char buffer[512];
printf("Sono entrato\n"); //Controllo se servi è eseguita
if( (newsock_id=accept(sock_id,0,0))<0 )
{
perror("Errore nell'accettazione della connessione");
printf("\n\nTerminazione\n");
exit(-1);
}
while(exit_cond==0)
{
if( (letti=read(newsock_id,buffer,sizeof(buffer)))<0 )
{
perror("Errore di lettura");
printf("\n\nTerminazione\n");
exit(-1);
}

if(strcmp(buffer,"quit\n")==0)
{
exit_cond=1;
}
else printf("%s\n",buffer);
}
close(newsock_id);
return;
}

int main(int argc, char *argv[])
{
char buffer[512];
int sock_id, newsock_id;
int exit_cond=0;
int exit_while=0;
int letti;
int users=1;
int rc;
pthread_t threads[MAX_NUM_CLIENTS];
if(argc!=1)
{
printf("Uso corretto: server ");
printf("\n\nTerminazione\n");
exit(-1);
}

sock_id=crea_socket(PORTNUM);

signal(SIGCHLD,fireman);

while(users>0)
{
users=0;
thread_buf[users].thread_id=users;
thread_buf[users].sock_id=sock_id;
if( (rc=pthread_create(&threads[users],NULL,servi,(void *) &thread_buf[users]))<0 )
{
perror("Errore nella creazione del thread");
printf("\n\nTerminazione\n");
exit(-1);
}
users--;
}
printf("Fine della comunicazione\n");
exit(0);
}