Salve a tutti, avrei bisogno di una mano per il programma che sto realizzando. Spero non vi spaventi la lunghezza del codice e che mi aiuterete lo stesso.
Allora, devo realizzare un client e un server che comunicano attraverso una sola coda di messaggi. Il client ricerca un volo fra quelli disponibili (per città di partenza, destinazione o per entrambe) e il server risponde inviando tutti i voli disponibili.
Questo è il file VOLI.TXT con, in ordine, partenza, destinazione e posti disponibili.
Roma
Milano
33
Salerno
Torino
75
Napoli
Bari
64
Questo è il client:
codice:#include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> #include <stdio.h> #include <stdlib.h> int main(){ int flag=1; int msgid, modo, ricerca; key_t my_key=1234; struct msgbuf{ pid_t pid; char partenza[90]; char destinazione[90]; }msg; struct voli{ long type; char partenza[90]; char destinazione[90]; int posti; } voli; if((msgid=msgget(my_key, 0))<0){ printf("Errore creazione coda\n"); exit(1); } printf("Aperta la coda con id: %d e chiave: %d\n", msgid, my_key); msg.pid=getpid(); while(flag){ printf("Inserire:\n\t1 per ricercare\n\t2 per inserire\n\t3 per prenotare\n"); scanf("%d", &modo); if(modo==1){ printf("Inserire:\n\t1 per ricercare la cittÃ_ di partenza\n\t2 per ricercare la cittÃ_ di destinazione\n\t3 per entrambe\n"); scanf("%d", &ricerca); if(ricerca==1){ printf("Inserisci la partenza: "); scanf("%s\n", &msg.partenza); msgsnd(msgid,&msg,sizeof(msg),0); msgrcv(msgid, &voli, sizeof(voli), msg.pid, MSG_NOERROR); } else if(ricerca==2){ printf("Inserisci la destinazione: "); scanf("%s\n", &msg.destinazione); msgsnd(msgid, &msg, sizeof(msg),0); msgrcv(msgid, &voli, sizeof(voli), msg.pid, MSG_NOERROR); } else if(ricerca==3){ printf("Inserisci la partenza: "); scanf("%s\n", &msg.partenza); printf("Inserisci la destinazione: "); scanf("%s\n", &msg.destinazione); msgsnd(msgid, &msg, sizeof(msg),0); msgrcv(msgid, &voli, sizeof(voli), msg.pid, MSG_NOERROR); } else printf("Valore non permesso!!\n\n"); printf("La ricerca ha dato questo esito:\n"); printf("\tPartenza: %s", voli.partenza); printf("\tDestinazione: %s", voli.destinazione); printf("\tPosti disponibili: %d", voli.posti); flag=0; } else if(modo==2){ printf("Funzione non ancora implementata!!\n\n"); flag=0; } else if(modo==3){ printf("Funzione non ancora implementata!!\n\n"); flag=0; } else printf("Scelta non permessa!!\n"); flag=0; } exit(0); }
E questo è il server:
Credo che il mio più grosso problema sia leggere le informazioni dal file. Comunque attendo vostre notizie. Vi ringrazio. Ciaoooocodice:#include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> #include <stdio.h> #include <stdlib.h> #include <signal.h> #include <sys/stat.h> #include <string.h> void sig_catch(int signo); FILE *lista; int msgid; int main(){ int flag=1; key_t my_key=1234; struct msgbuf{ pid_t pid; char partenza[90]; char destinazione[90]; }msg; struct voli{ long type; char partenza[90]; char destinazione[90]; int posti; } voli; signal(SIGINT, sig_catch); if((lista=fopen("VOLI.TXT", "r"))<0){ printf("Errore apertura file voli\n"); exit(1); } if((msgid=msgget(my_key, IPC_CREAT | 0660))<0){ printf("Errore creazione coda\n"); exit(1); } printf("Creata la coda con id: %d e chiave: %d\n", msgid, my_key); while(flag){ if(msgrcv(msgid, &msg, sizeof(msg), 0, MSG_NOERROR)<0){ printf("Errore msgrcv\n"); exit(1); } printf("Ho letto il messaggio di %d\n", msg.pid); voli.type=msg.pid; while((fgets(voli.partenza, sizeof(voli.partenza), lista))!=NULL){ fgets(voli.destinazione, sizeof(voli.destinazione), lista); fscanf(lista, "%d", voli.posti); if(strcmp(msg.partenza, voli.partenza)==0) msgsnd(msgid, &voli, sizeof(voli),0); else if(strcmp(msg.destinazione, voli.destinazione)==0) msgsnd(msgid, &voli, sizeof(voli),0); else printf("La ricerca non ha dato esiti!!\n"); flag=0; } } close(lista); if((msgctl(msgid, IPC_RMID, 0))<0){ printf("Errore rimozione della coda\n"); exit(1); } printf("Rimossa la coda con id %d\n", msgid); exit(0); } void sig_catch(int signo){ printf("Terminata l'esecuzione del server\n"); msgctl(msgid, IPC_RMID, 0); close(lista); exit(2); }

Rispondi quotando