Salve ragazzi...ho ancora un problema!!!Il programma che ho scritto viene compilato correttamente,ma non funziona...questo il server:
va in loop una volta avviato!!!codice:#include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include <sys/stat.h> #include <sys/types.h> #include <fcntl.h> #include <unistd.h> typedef struct{ char titolo[50]; char autore[50]; unsigned short disponibilita; }Testo; struct richiesta{ char tit[50]; char aut[50]; pid_t pid; char msg[50]; }msg; int main(void){ int fd,fd1; pid_t pid; FILE *fp; Testo libri[10]; char opz,PID_FIFO[100]; char buffer[50]; unsigned short i=0; time_t start; mkfifo("WK_FIFO",0666); //creo la wk fifo start=time(NULL); while(difftime(time(NULL),start)<100.){ fd=open("WK_FIFO",O_RDONLY); if(read(fd,&msg,sizeof(msg))<=0) printf("Errore di lettura da WK_FIFO\n"); if(close(fd)<0) printf("Errore chiusura WN_FIFO\n"); if(strcmp(msg.msg,"FINE")==0){ //richiesta del client di chiudere la connessione remove("WK_FIFO"); printf("Fine esecuzione\n"); exit(0); } fp=fopen("libri.txt","r"); if(fp==NULL){ printf("Errore di lettura file!\n"); exit(1); } while(!feof(fp)){ fgets(buffer,sizeof(buffer),fp); buffer[strlen(buffer)-1]='\0'; strcpy(libri[i].titolo,buffer); fgets(buffer,sizeof(buffer),fp); buffer[strlen(buffer)-1]='\0'; strcpy(libri[i].autore,buffer); fgets(buffer,sizeof(buffer),fp); libri[i].disponibilita=(unsigned short)atoi(buffer); i++; } sprintf(PID_FIFO,"%d.FIFO",msg.pid); mkfifo(PID_FIFO,0666); fd1=open(PID_FIFO,O_WRONLY); for(i=0;i<10;i++){ if((strcmp(libri[i].titolo,msg.tit))!=0||(strcmp(libri[i].autore,msg.aut))!=0){ write(fd1, libri[i].titolo, strlen(libri[i].titolo)); write(fd1, libri[i].autore, strlen(libri[i].autore)); write(fd1, &(libri[i].disponibilita), sizeof(libri[i].disponibilita)); } } if(close(fd1)<0) printf("Errore chiusura fifo di risposta\n"); remove(PID_FIFO); } }
Questo il client:
il client si blocca una volta richiesta una ricerca.codice:#include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include <sys/stat.h> #include <sys/types.h> #include <fcntl.h> #include <unistd.h> typedef struct{ char titolo[50]; char autore[50]; unsigned short disponibilita; }Testo; struct richiesta{ char tit[50]; char aut[50]; pid_t pid; char msg[50]; }msg; int main(void){ pid_t pid; int fd,fd1,flag=1; FILE *fp; Testo libri[10]; char opz,opz1,PID_FIFO[100]; char buffer[50]; unsigned short disponibilita,i=0; time_t start; char titolo[50], autore[50]; int nread; pid=getpid(); while(1){ while(flag){ printf("Digitare:\nR per ricercare un libro per titolo o autore\nU per uscire\nD per disconnettere\n"); scanf("%c",&opz); opz=toupper(opz); if(opz=='R'||opz=='U'||opz=='D') flag=0; } if(opz=='U'){ exit(0); } else if(opz=='D'){ sprintf(msg.msg,"FINE"); fd=open("WK_FIFO",O_WRONLY); write(fd,&msg,sizeof(msg)); close(fd); exit(0); } flag=1; fd=open("WK_FIFO",O_WRONLY); while(flag){ printf("Ricerca Libro:\nDigitare T per ricerca Titolo\nDigitare A per ricerca Autore\n"); scanf("%c",&opz1); opz1=toupper(opz1); if(opz1=='T'||opz1=='A') flag=0; } if(opz1=='T'){ printf("Digita il Titolo del libro da ricercare:\n"); scanf("%s",msg.tit); msg.pid=pid; write(fd,&msg,sizeof(msg)); if(close(fd)<0) printf("Errore nella chiusura della WK_FIFO\n"); sprintf(PID_FIFO,"%d.FIFO",pid); while((fd1=open(PID_FIFO,O_RDONLY))<0) ; nread = read(fd1, titolo, sizeof(titolo)); titolo[nread] = '\0'; nread = read(fd1, autore, sizeof(autore)); autore[nread] = '\0'; read(fd1, &disponibilita, sizeof(disponibilita)); if(close(fd1)<0) printf("Errore chiusura FIFO_RISPOSTA\n"); printf("Il risultato della ricerca è:\n"); printf("Titolo: %s\nAutore: %s\nDisponibilità: %hu\n", titolo, autore, disponibilita); } else if(opz1=='A'){ printf("Digita l' Autore del libro da ricercare:\n"); scanf("%s",msg.aut); msg.pid=pid; write(fd,&msg,sizeof(msg)); if(close(fd)<0) printf("Errore nella chiusura della WK_FIFO\n"); sprintf(PID_FIFO,"%d.FIFO",pid); while((fd1=open(PID_FIFO,O_RDONLY))<0) ; nread = read(fd1, titolo, sizeof(titolo)); titolo[nread] = '\0'; nread = read(fd1, autore, sizeof(autore)); autore[nread] = '\0'; read(fd1, &disponibilita, sizeof(disponibilita)); if(close(fd1)<0) printf("Errore chiusura FIFO_RISPOSTA\n"); printf("Il risultato della ricerca è:\n"); printf("Titolo: %s\nAutore: %s\nDisponibilità: %hu\n", titolo, autore, disponibilita); } } }
Il programma consiste nel gestire un file con dei libri(titolo,autore e disponibilita)-server-
il client interroga il server con ricerca titolo o autore,vengono proposti a video tutti quelli che soddisfano la richiesta.La comunicazione è tramite fifo.
Ringrazio chiunque voglia darmi una mano a risolvere!!!

Rispondi quotando
