Scrivo questo aimhè dopo aver già scritto il messaggio:
Il
crossposting è una tecnica vietata e poco carina nel rispetto di chi ti aiuta.
Naturalmente senza tutto il codice non si può trarre nessuna conclusione, leggendo quello che hai posato però è quasi chiaro che il problema è nella connessione e nella comunicazione,bisognerebbe metter un paio di printf in qua e la (naturalmente non a caso ma in punti ben precisi) per capire se è la fase di connessione o la fase di lettura e scrittura tra i socket il problema.
Potrebbe essere anche il cliente.
Insomma con tutto il codice avremmo potuto eseguirlo sulle nostre macchine e testare i problemi.
Prima però di postarlo per favore ripuliscilo da tutta l'immondizia!
ecco ad esempio il tuo codice lievemente ripulito.
//presumo ci sia un Main e un listen che sarebbe stato carino vedere
while(1)
{
if((connect_fd=accept(sd,NULL,NULL))==-1)
{
perror("errore di connessione");
exit(0);
}
pthread_create(&tid,NULL,menu,(void *) &connect_fd);
}
//con un while 1 e un exit in errore dall'accept tutto quello che c'era qui sotto
//non serve a nulla perchè non verrà mai eseguito.
return 0;//solo per cordialità
}
// questa è la funzione menu (handler del thread) metto solo una piccola parte perchè ripeto il codice
// è lungo e poi è simile nel senso che ogni caso fa una lettura e scrittura da socket
void *menu(void *arg)
{
int *sd= (int *) arg;
char leggi[50],buffer[512],path[20],voto,trova[5],user[10];
int indice,fd,contatore=0;
float media=0;
login(*sd,user);
do
{
contatore=0;
//memset(path,0,sizeof(path)); INUTILE
strcpy(path,path_hotel);
do
{
comunica(*sd,"\n benvenuto!\n che cosa vuoi fare ora?\n(1)lista hotel valutati con voto medio\n(2)leggere valutazioni di un hotel\n(3)scrivere una propria valutazione\n(4)disconnetti\n(5)esci\n");
read(*sd,leggi,1);
indice=atoi(leggi);
}while(indice<1 && indice>5);
switch(indice)
{
case 1: // stampa del file lista
//memset(buffer, 0, sizeof(buffer));
fd=open("hotel/lista",O_RDONLY);
write(*sd,"leggi",6);
// sleep(1); INUTILE LE SOCKET SONO BUFFERIZZATE
//leggi e invii un carattere per volta usando un buffer da 512 byte?
//sarebbe piu logico inviare prima la dimensione del file al client
//poi inviare il file pacchettizzato, naturalmente quando il client
//sapendo quanto è grande il file sa in automatico quando finisce la transazione
while(read(fd,buffer,1)>0)
{
write(*sd,buffer,1);
}
write(*sd,"#",1);
close(fd);
break;
}
//Da una parte manca la testa e dall'altra la coda...
void login(int connect_fd,char user[])
{
int fd,len_pswd=0;
char buffer[50],password[50];
char path[50];
int err=0;
char scelta[2];
while(1)
{
memset(user, 0, sizeof(user));
err=0;
comunica(connect_fd,"[R]egistrati o esegui il [L]ogin per poter vedere la lista degli hotel\n");
read(connect_fd,scelta,1);
if(scelta[0]=='l' || scelta[0]=='L')
{
strcpy(path,path_user);
comunica(connect_fd,"inserisci l'user con cui vuoi eseguire il login\n");
memset(buffer, 0, sizeof(buffer));//sicuramente messa per una cattivo invio dei dati dal client
read(connect_fd,buffer,50);
strcpy(user,buffer);
strcat(path,buffer); //ma path ? dove l'hai inizializzato?????????
//Logica contorta! Modificata
if( (fd=open(path,O_RDONLY)) <= 0 )
{
comunica(connect_fd,"il nome utente non esiste\n");
continue;
}
do
{
comunica(connect_fd,"Inserisci la password,attenzione la password deve contenere 7 caratteri\n");
memset(buffer, 0, sizeof(buffer));//ci risiamo...
read(connect_fd,buffer,50);
}while(strlen(buffer)<7 || strlen(buffer)>7);
read(fd,password,7);
close(fd);
// la parte qui sotto era da manicomio!
if( !strcmp(password,buffer) )
{break;}
else
{comunica(connect_fd,"password sbagliata!\n");}
}
//pthread_mutex_unlock(&sem);
}
}