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