Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it L'avatar di magsas
    Registrato dal
    Jul 2008
    Messaggi
    15

    [C]Aiuto per realizzare un client e un server per la ricerca di voli

    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

  2. #2

  3. #3
    Utente di HTML.it L'avatar di magsas
    Registrato dal
    Jul 2008
    Messaggi
    15
    Spero così vada bene.

  4. #4
    Originariamente inviato da magsas
    Spero così vada bene.
    Ma qual'è il problema ? Cosa non riesci a fare ?

  5. #5
    Utente di HTML.it L'avatar di magsas
    Registrato dal
    Jul 2008
    Messaggi
    15
    Non riesco a leggere le informazione dal file e a confrontarle con le richieste del client

  6. #6
    Io modificherei la struttura del file VOLI.TXT.
    Primo lo aprirei in modalità binaria, e ci scriverei direttamente il codice binario dei record.
    Così la lettura diventa più veloce e facile.

    Per l'inserimento:
    codice:
    /* ... Legge da input ... */
    
    /* Scrive su file */
    fwrite(voli, sizeof(struct voli), 1, stream);
    Per la lettura:
    codice:
    while(!feof()){
    
       fread(voli, sizeof(struct voli), 1, stream);
       
       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");
    
    }
    Poi "La ricerca non ha dato esiti" lo invierei direttamente al client.
    Anzi farei in modo che il server invii direttamente l'output della ricerca, così da non scomodare il client.

  7. #7
    Utente di HTML.it L'avatar di magsas
    Registrato dal
    Jul 2008
    Messaggi
    15
    Ciao, ti ringrazio per avermi risposto. Ho provato a fare le modifiche che mi hai detto, ma comunque non va. Non capisco perchè. Poi, il file deve essere in quella forma!!!

  8. #8
    Originariamente inviato da magsas
    Ciao, ti ringrazio per avermi risposto. Ho provato a fare le modifiche che mi hai detto, ma comunque non va. Non capisco perchè. Poi, il file deve essere in quella forma!!!
    Non puoi modificare il formato del file ? Università ?
    Allora prova semplicemente:
    codice:
    while(!feof(lista)){
       
       if(fscanf(lista, "%89s", voli.partenza) == EOF)
          break;
    
       if(fscanf(lista, "%89s", voli.destinazione) == EOF)
          break;
    
       if(fscanf(lista, "%d", &voli.posti) == EOF)
          break;
    
       printf("Confronto %s e %s\n", msg.partenza, voli.partenza);
       printf("Confronto %s e %s\n", msg.destinazione, voli.destinazione);
    
       if(strcmp(msg.partenza, voli.partenza) == 0){
    
          printf("%s e %s combaciano\n", msg.partenza, voli.partenza);
          msgsnd(msgid, &voli, sizeof(voli), 0);
    
        }
       	
       else if(strcmp(msg.destinazione, voli.destinazione) == 0){
    
          printf("%s e %s combaciano\n", msg.destinazione, voli.destinazione);
          msgsnd(msgid, &voli, sizeof(voli), 0);
    
       }
       
       else 
          printf("La ricerca non ha dato esiti!!\n");
    
       flag=0;
    
    }
    Ho messo qualche messaggio di debug, per vedere se non ci sono errori nell'invio.
    Ma poi sei sicuro di utilizzare msgsnd e msgrcv correttamente ?
    Io leggo qua :
    The msgsnd() and msgrcv() system calls are used, respectively, to send messages to, and receive messages from, a message queue. The calling process must have write permission on the message queue in order to send a message, and read permission to receive a message.

    The msgp argument is a pointer to caller-defined structure of the following general form:

    struct msgbuf {

    long mtype;
    /* message type, must be > 0 */
    char mtext[1];
    /* message data */
    };

    The mtext field is an array (or other structure) whose size is specified by msgsz, a non-negative integer value. Messages of zero length (i.e., no mtext field) are permitted. The mtype field must have a strictly positive integer value. This value can be used by the receiving process for message selection (see the description of msgrcv() below).
    quindi io modificherei in:
    codice:
    struct msgbuf{ 		
       
       long type;
       struct voli *voli;
    
    };	
    
    struct voli{
    
       char partenza[90];
       char destinazione[90];
       int posti;
    
    };
    e metteri queste definizioni in un file header.

  9. #9
    Utente di HTML.it L'avatar di magsas
    Registrato dal
    Jul 2008
    Messaggi
    15
    Ciao menphisx,
    ho seguito i tuoi consigli e finalmente riesco a leggere i dati dal file. Però il programma non va ancora perchè i dati che mando dal client, arrivano al server "strani", nel senso che compaiono caratteri particolari, come se fossero in binario o qualcosa del genere. Non so se mi sono spiegato. Proverò domani a correggere questo problema. Ti farò sapere. Ciaoooo e grazie mille.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.