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:
codice:
#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);
}
Credo che il mio più grosso problema sia leggere le informazioni dal file. Comunque attendo vostre notizie. Vi ringrazio. Ciaoooo