Salve ragazzi...ho ancora un problema!!!Il programma che ho scritto viene compilato correttamente,ma non funziona...questo il server:
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);
}
}
va in loop una volta avviato!!!
Questo il client:
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 client si blocca una volta richiesta una ricerca.
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!!!