Sistema Suse 9.2, linguaggio C , compilatore gcc.
Ho realizzato un sistema di prenotazione posti per una sala cinematografica, con un processo su una macchina server che gestisce la mappa dei posti.
Ogni posto è caratterizzato da numero di fila, numero di poltrona e da un flag che indica se il posto è prenotato o meno.
Il server accetta e processa sequenzialmente le richieste prenotazioni di posti da uno o piu' client che possono essere sulla stessa macchina o in remoto(quindi macchine diverse).
Come struttura ho utilizzato una matrice statica [3][3]
Con un unico client funziona tutto perfettamente , ma quando si connette un secondo client ,questo visualizza una matrice che nn tiene conto delle prenotazioni effettuate dal primo client, e la stessa cosa vale per il primo client.
Quindi i vari client nn fanno riferimento alla stessa matrice
All'inizio pensavo che dipendesse dalla posizione dell chiamata alla funzione inizializza(cinema) , ma quando il secondo client si connette questa nn dovrebe essere chiamata.
Ecco il codice del main del server:
La struttra posto l'ho definita cosicodice://main server int main(int argc,char *argv[]) { char scelta[1]; char out[MAX_DIM]; char buff[MAX_DIM]; int ds_sock,/*ds_sock_acc,*/ret,lenght; struct sockaddr_in server; struct sockaddr client; struct posto cinema[3][3]; // inizializza_cinema(cinema); // system("clear" ); //qui ho omesso il codice del socket x snellire la lettura del testo printf("in attesa di connessione da parte del client!!\n\n" ); // // while(1) { while((ds_sock_acc=accept(ds_sock,&client,&lenght)) ==-1); printf("client connesso!!\n\n" ); if (fork()==0) { close(ds_sock); do { strcpy(out," "); read(ds_sock_acc,buff,MAX_DIM); // scelta=buff; if ((strcmp(buff,"A")==0)||(strcmp(buff,"a") ==0)) { posti_vuoti(cinema); //printf("%s\n",buff); } else if ((strcmp(buff,"B")==0)||(strcmp(buff,"b") ==0)) { controllo_posto(cinema); } else if ((strcmp(buff,"C") ==0)||(strcmp(buff,"c") ==0)) { annulla_posto(cinema); } else if((strcmp(buff,"D") ==0)||(strcmp(buff,"d") ==0)) { strcpy(out,"fatto"); } }//relativa al do while (strcmp(out,"fatto") !=0); // write(ds_sock_acc,"\n\nArrivederci!!",20); close(ds_sock_acc); printf("Client disconnesso!!\n\n"); printf("\nIn attesa di connessione da nuovo client!!\n\n"); exit(0); }//della fork else close(ds_sock_acc); //è del fork==0 }//del while(1) }//del main
struct posto
{
unsigned char idPosto[6];
int flag;
};
la funzione inizializza_cinema
Non ben chiaro come procedere per risolvere. Se usare una matrice dinamica (ho il problema che la matrice l'ho dichiarata di tipo posto), memoria condivisa o tutte e due.codice:void inizializza_cinema(struct posto cine[3][3]) { unsigned char i,j,k; k='1'; for(i='A';i<='C';i++) { //printf("\n"); for(j='1';j<='3';j++) { cine[i-'A'][j-'1'].flag=0; cine[i-'A'][j-'1'].idPosto[0]=' '; cine[i-'A'][j-'1'].idPosto[1]=i; cine[i-'A'][j-'1'].idPosto[2]=j; cine[i-'A'][j-'1'].idPosto[3]=' '; cine[i-'A'][j-'1'].idPosto[4]='\t'; cine[i-'A'][j-'1'].idPosto[5]='\0'; } cine[i-'A'][2].idPosto[4]='\n'; }
Spero che la discussione troppo lunga nn spaventi e che qualcuno riesca ad aiutarmi.


Rispondi quotando