Visualizzazione dei risultati da 1 a 2 su 2
  1. #1

    [C]matrice statica o dinamica o memoria condivisa

    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:

    codice:
    //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
    La struttra posto l'ho definita cosi

    struct posto
    {
    unsigned char idPosto[6];
    int flag;
    };

    la funzione inizializza_cinema
    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';
       }
    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.
    Spero che la discussione troppo lunga nn spaventi e che qualcuno riesca ad aiutarmi.

  2. #2
    Nel punto in cui c'è la funzione inizializza_cinema ho messo la stessa funzione all'interno di una struttura di scelta condizionale in cui chiede se iniziializzare la matirce o no.

    Quando il server parte la prima volta chiede se inizializzare la matrice una volta risposto si il server si mette in ascolto sulla socket in attesa di client e accetta connessioni.

    Alla prima connessione ovviamente del client la matrice è inizializzata , se si connette un secondo client tuttavia la richiesta di inizializzare il server nn la pone(quindi la chiamata inizializza cinema nn è riutilizzata dal server), pero' la matrice visualizzata dal secondo client (tutti posti vuoti) nn presenta le prenotzioni fatte dal primo(e la stessa cosa vale per il primo client poi).

    Se all'avvio del server si risponde no alla richiesta di inizializzare la matrice quando i vari client si connettono visualizzano dei valori casuali .

    Da cio' deduco che nn dipenda dalla posizione in cui si inizializza la matrice. Inolte la dichiarazione struct posto cinema si trova all'inizio del main dove si dichiarano variabili e strutture.

    Forse il problema e nella struct

    struct posto

    { char idPosto[6] ;

    int flag;

    }

    Se allocassi memoria condivisa (in maniera dinamica?) x il vettore idPosto, o se allocassi spazi odi memoria sol ox il flag che tiene conto 0 dei posti liberi e con valore1 dei posti occupati??

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 © 2025 vBulletin Solutions, Inc. All rights reserved.