Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2007
    Messaggi
    49

    Problema con RPC

    Ciao a tutti,
    sono alle prime armi con RPC e non riesco a capire il perche' della stampa di una printf
    vi posto il codice:
    codice:
    static int inizial = 0;
    static Candidati candidati;
    static Liste elencoliste;
    
    
    void inizializza()
    {
          int i;
          
          if(inizial == 1)
          {
           
               printf("\n\n\n inizializ vale %i", inizial);
               return;
          
    
          }
          else
          {
            for(i = 0; i< N; i++)
            {
              printf("\n inizia la procedura di preparazione di candidati...");
              candidati.candidato[i].nome[0] = '\0';
              candidati.candidato[i].nome_lista[0] = '\0';
              candidati.candidato[i].value = 0;
              printf("inizializzato candidato %i", i);
            }
            for(i = 0; i< N; i++)
            {
               elencoliste.liste[i].lista[0] = '\0';
               elencoliste.liste[i].coalizione[0] ='\0';
               printf("\ninizializzato candidato %i", i);
            }
            
            printf("\nRiempimento struttura liste e check inizializzazzione.....");
            strcpy(elencoliste.liste[0].lista,"nulla");
            strcpy(elencoliste.liste[0].coalizione,"nulla");
    
            strcpy(elencoliste.liste[1].lista,"cataldi");
            strcpy(elencoliste.liste[1].coalizione,"cater bruno");
    
            strcpy(elencoliste.liste[2].lista,"valer");
            strcpy(elencoliste.liste[2].coalizione,"rita d-avorio");
    
            strcpy(elencoliste.liste[3].lista,"aldi");
            strcpy(elencoliste.liste[3].coalizione,"poiater rino");
         
          for(i = 0; i< N; i++)
          {
            printf("elencoListe %i esimo: %s  e %s", i, elencoliste.liste[i].lista, elencoliste.liste[i].coalizione);
          }
          inizial= 1;
          printf("\nValore di inizial posto ad %i", inizial); 
            
          }
        
    }
    
    //funzione per la richiesta totale dei voti...
    
    int * visualizzazzione_voti_lista_1_svc(Input *name, struct svc_req * rqstp)
    {
     int i;
     int valore = 0;
     static int result = -1;
     printf("\nSono qui....nome lista richiesta:%s", name->lista);    // questa printf stampa il nome lista passato
                                                                                              // nella precedente chiamata
     inizializza();
     printf("\nSono qui....nome lista richiesta:%s", name->lista);   // questo stampa quello attuale
      for(i = 0; i<N; i++)
      {
        if(strcmp(name->lista, elencoliste.liste[i].lista)== 0)
        {
         valore = 0;
         break;
        }
       valore = -1; 
      }
      if(valore < 0 )  // non esiste la lista
       return (&result);
     
      for( i = 0; i<N; i++)
      {
         if(strcmp(name->lista, candidati.candidato[i].nome_lista)== 0)
        {
              result +=  candidati.candidato[i].value;
        }
      }
    return (&result);
    }
    Allora la procedura inizializza....ha il compito di inizializzare le strutture dati al primo avvio....queste sono due Candidati e Liste;
    Nella funzione int * visualizzazzione_voti_lista_1_svc(Input *name, struct svc_req * rqstp) viene richiamata sempre inizializza che tramite una variabile statica ....sa se devono essere inizializzate le due strutture, se la variabile assume il valore 1 significa che inizializza e' gia stata eseguita...e quindi ritornera' semplicemente senza fare nulla.....

    La chiamata di nella funzione ha una printf() prima e una printf() dopo.... per stampare il valore passato alla procedura
    remota sia dopo e che prima della chiamata di inizializza......
    codice:
     printf("\nSono qui....nome lista richiesta:%s", name->lista);    // questa printf stampa il nome lista passato
                                                                                              // nella precedente chiamata
     inizializza();
     printf("\nSono qui....nome lista richiesta:%s", name->lista);   // questo stampa quello attuale
    non capisco perche' le due printf stampano differenti valori.....eppute di static non ce nulla?
    Qualcuno sa spiegarmi il perche'???????????????

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    Fornisci tutto il codice (compreso di main e strutture, costanti ...) per poterlo compilare ed eseguire (per provarlo senza perdere troppo tempo).

    P.S. Che intendi esattamente con 'RPC' ?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2007
    Messaggi
    49
    Grazie per aver risposto!

    Per RPC intendo REMOTE PROCEDURE CALL (tipo Sun RPC);
    Posto il main ("Client") e il file .x per generare il .h con rpcgen e per ultimo il file del server che contiene la definizione della procedura remota
    codice:
    #include <stdio.h>
    #include <rpc/rpc.h>
    #include"lista.h"
    
    main(int argc, char *argv[])
    {
     CLIENT *cl;
     int *result = NULL;
     char ch;
     NuovoCandidato nuovoCand;
     Input in;
     char * server;
      if(argc< 2)
      {
        printf("\n Errore...to many parametres..");
        exit(1);
      }
      server = argv[1];
    
      cl = clnt_create(server, VOTAZIONIPULITE,VOTAZIONIPULITEVERS, "udp");
      if(cl == NULL)
      {
        clnt_pcreateerror(server);
        exit(1);
      }
      
      // dati input
      do
      {
        printf("\nInserire l-operazione : A = aggiungi candidato \t B= ottieni totale voti \n\n");
        
        ch = getchar();
        fgetc(stdin); // elimino l'invio...
    
        if( ch == 'A')
        {
           printf("Inserisci la lista candidato:");
           scanf("%s", nuovoCand.lista);
           fgetc(stdin); // elimino l'invio...
           printf("\nNome candidato: ");
           scanf("%s", nuovoCand.nome);
           fgetc(stdin); // elimino l'invio...
          
            printf("\ninvio dati %s e %s ", nuovoCand.nome, nuovoCand.lista);
            result =  inserimento_candidato_1(&nuovoCand, cl);
    
            if(*result >= 0)
            {
              printf("\nOperazione completata con successo...candidato %s..aggiunto", nuovoCand.nome);
            }
            else
            {
              printf("\nErrore nella rpc...");
            }
        }
        if( ch == 'B')
        {
          printf("Inserisci il nome della lista: ");
          scanf("%s", in.lista);
          fgetc(stdin); // elimino l'invio...
          result = visualizzazzione_voti_lista_1(&in, cl);
        
            if(result == NULL) 
            { 
                 clnt_perror(cl, server); 
                 exit(1); 
            }
    
            if(*result >= 0)
            {
              printf("\nOperazione completata con successo..voti:%i..", *result);
            }
            else
            {
              printf("\nErrore nella rpc...");
            }
          
        }
          
      }while(ch != EOF);
    clnt_destroy(cl);
    exit(0);
    
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    file .x per rpcgen
    [/CODE]
    const DIM_NOME_LISTA= 15;
    const DIM_COALIZIONE = 15;
    const DIM_NOME = 15;
    const N = 10;

    struct Lista{ char lista[DIM_NOME_LISTA]; char coalizione[DIM_COALIZIONE];};

    struct Liste{ Lista liste[N];};

    struct Candidato{ char nome[DIM_NOME]; char nome_lista[DIM_NOME_LISTA]; int value;};

    struct Candidati {Candidato candidato[N];};

    struct NuovoCandidato{ char nome[DIM_NOME]; char lista[DIM_NOME_LISTA];};

    struct Input{ char lista[DIM_NOME_LISTA];};

    program VOTAZIONIPULITE {

    version VOTAZIONIPULITEVERS
    {
    int VISUALIZZAZZIONE_VOTI_LISTA(Input) = 1;

    } = 1;
    } = 0x20000013;

    [CODE]


    file che implementa le procedure per il server remoto posto solo 1 procedura con la funzione inizializza()
    codice:
    #include <stdio.h>
    #include <rpc/rpc.h>
    #include<string.h>
    #include"lista.h"
    
    
    
    static int inizial = 0;
    static Candidati candidati;
    static Liste elencoliste;
    
    
    void inizializza()
    {
          int i;
          
          if(inizial == 1)
          {
           
               printf("\n\n\n inizializ vale %i", inizial);
               return;
          
    
          }
          else
          {
            for(i = 0; i< N; i++)
            {
              printf("\n inizia la procedura di preparazione di candidati...");
              candidati.candidato[i].nome[0] = '\0';
              candidati.candidato[i].nome_lista[0] = '\0';
              candidati.candidato[i].value = 0;
              printf("inizializzato candidato %i", i);
            }
            for(i = 0; i< N; i++)
            {
               elencoliste.liste[i].lista[0] = '\0';
               elencoliste.liste[i].coalizione[0] ='\0';
               printf("\ninizializzato candidato %i", i);
            }
            
            printf("\nRiempimento struttura liste e check inizializzazzione.....");
            strcpy(elencoliste.liste[0].lista,"nulla");
            strcpy(elencoliste.liste[0].coalizione,"nulla");
    
            strcpy(elencoliste.liste[1].lista,"cataldi");
            strcpy(elencoliste.liste[1].coalizione,"cater bruno");
    
            strcpy(elencoliste.liste[2].lista,"valer");
            strcpy(elencoliste.liste[2].coalizione,"rita d-avorio");
    
            strcpy(elencoliste.liste[3].lista,"aldi");
            strcpy(elencoliste.liste[3].coalizione,"poiater rino");
    
            strcpy(candidati.candidato[0].nome_lista ,"aldi");
            strcpy(candidati.candidato[0].nome ,"gianluigi piero");
            candidati.candidato[0].value = 3;
        
            strcpy(candidati.candidato[3].nome_lista ,"aldi");
            strcpy(candidati.candidato[3].nome ,"gianluigi piero");
            candidati.candidato[3].value = 3;       
         
          for(i = 0; i< N; i++)
          {
            printf("elencoListe %i esimo: %s  e %s", i, elencoliste.liste[i].lista, elencoliste.liste[i].coalizione);
          }
          inizial= 1;
          printf("\nValore di inizial posto ad %i", inizial); 
          return;
          }
         
        
    }
    
    
    
    int * visualizzazzione_voti_lista_1_svc(Input *name, struct svc_req * rqstp)
    {
     int i;
     int valore = 0;
     static int result = -1;
     printf("\nSono qui....nome lista richiesta:%s", name->lista);
     inizializza();
     printf("\nDopo inizializza......nome lista richiesta:%s", name->lista);
      for(i = 0; i<N; i++)
      {
        if(strcmp(name->lista, elencoliste.liste[i].lista)== 0)
        {
         valore = 0;
         break;
        }
       valore = -1; 
      }
      if(valore < 0 )  // non esiste la lista
       return (&result);
     
      for( i = 0; i<N; i++)
      {
         if(strcmp(name->lista, candidati.candidato[i].nome_lista)== 0)
        {
              result +=  candidati.candidato[i].value;
        }
      }
    return (&result);
    }

  4. #4
    Utente di HTML.it
    Registrato dal
    May 2007
    Messaggi
    49
    Scusa, ti ho postato i file con una procedura in piu ti posto quelli in cui c'e solo questa procedura che mi da problemi

    A) file .x per rpcgen
    codice:
    const DIM_NOME_LISTA= 15;
    const DIM_COALIZIONE = 15;
    const DIM_NOME = 15;
    const N = 10;
    
    struct Lista{ char lista[DIM_NOME_LISTA]; char coalizione[DIM_COALIZIONE];};
    
    struct Liste{ Lista liste[N];};
    
    struct Candidato{ char nome[DIM_NOME]; char lista[DIM_NOME_LISTA]; int value;};
    
    struct Candidati {Candidato candidato[N];};
    
    struct NuovoCandidato{ char nome[DIM_NOME]; char lista[DIM_NOME_LISTA];};
    
    struct Input{ char lista[DIM_NOME_LISTA];};
    
    program VOTAZIONIPULITE {
        
         version VOTAZIONIPULITEVERS
         {
            int VISUALIZZAZZIONE_VOTI_LISTA(Input) = 1;
    
         } = 1;
    } = 0x20000013;

    B) file con main del client....

    codice:
    #include <stdio.h>
    #include <rpc/rpc.h>
    #include"lista.h"
    
    main(int argc, char *argv[])
    {
     CLIENT *cl;
     int *result = NULL;
     char ch;
     NuovoCandidato nuovoCand;
     Input in;
     char * server;
      if(argc< 2)
      {
        printf("\n Errore...to many parametres..");
        exit(1);
      }
      server = argv[1];
    
      cl = clnt_create(server, VOTAZIONIPULITE,VOTAZIONIPULITEVERS, "udp");  // creo gestore di trasporto...
      if(cl == NULL)
      {
        clnt_pcreateerror(server);
        exit(1);
      }
      
      // dati input
      do
      {
        printf("\nDigita B per ottenere il totale voti su una lista \n\n");
        
        ch = getchar();
        fgetc(stdin); // elimino l'invio...
    
        if( ch == 'B')
        {
          printf("Inserisci il nome della lista: ");
          scanf("%s", in.lista);
          fgetc(stdin); // elimino l'invio...
          result = visualizzazzione_voti_lista_1(&in, cl);
        
            if(result == NULL) 
            { 
                 clnt_perror(cl, server); 
                 exit(1); 
            }
    
            if((*result) >= 0)
            {
              printf("\nOperazione completata con successo..voti:%i..", (*result));
            }
            else
            {
              printf("\nErrore nella rpc...");
            }
          
        }
          
      }while(ch != EOF);
    clnt_destroy(cl);
    exit(0);
    
    }

    C) file con implementazione procedura remota dichiarata nel .x per il server
    codice:
    #include <stdio.h>
    #include <rpc/rpc.h>
    #include<string.h>
    #include"lista.h"
    
    
    
    static int inizial = 0;
    static Candidati candidati;
    static Liste elencoliste;
    
    
    void inizializza()
    {
          int i;
          
          if(inizial == 1)
          {
           
               printf("\n\n\n inizializ vale %i", inizial);
               return;
          
    
          }
          else
          {
            for(i = 0; i< N; i++)
            {
              printf("\n inizia la procedura di preparazione di candidati...");
              candidati.candidato[i].nome[0] = '\0';
              candidati.candidato[i].lista[0] = '\0';
              candidati.candidato[i].value = 0;
              printf("inizializzato candidato %i", i);
            }
            for(i = 0; i< N; i++)
            {
               elencoliste.liste[i].lista[0] = '\0';
               elencoliste.liste[i].coalizione[0] ='\0';
               printf("\ninizializzato candidato %i", i);
            }
            
            printf("\nRiempimento struttura liste e check inizializzazzione.....");
            strcpy(elencoliste.liste[0].lista,"nulla");
            strcpy(elencoliste.liste[0].coalizione,"nulla");
    
            strcpy(elencoliste.liste[1].lista,"cataldi");
            strcpy(elencoliste.liste[1].coalizione,"cater bruno");
    
            strcpy(elencoliste.liste[2].lista,"valer");
            strcpy(elencoliste.liste[2].coalizione,"rita d-avorio");
    
            strcpy(elencoliste.liste[3].lista,"aldi");
            strcpy(elencoliste.liste[3].coalizione,"poiater rino");
    
            strcpy(candidati.candidato[0].lista ,"aldi");
            strcpy(candidati.candidato[0].nome ,"gianluigi piero");
            candidati.candidato[0].value = 3;
        
            strcpy(candidati.candidato[3].lista ,"aldi");
            strcpy(candidati.candidato[3].nome ,"gianluigi piero");
            candidati.candidato[3].value = 3;       
         
          for(i = 0; i< N; i++)
          {
            printf("\nelencoListe %i esimo: %s  e %s", i, elencoliste.liste[i].lista, elencoliste.liste[i].coalizione);
          }
          inizial= 1;
          printf("\nValore di inizial posto ad %i", inizial); 
          return;
          }
         
        
    }
    
    int * visualizzazzione_voti_lista_1_svc(Input *name, struct svc_req * rqstp)
    {
     int i;
     int valore = 0;
     static int result = -1;
     printf("\nSono qui....nome lista richiesta:%s", name->lista);
     inizializza();
     printf("\nDopo inizializza......nome lista richiesta:%s", name->lista);
      for(i = 0; i<N; i++)
      {
        if(strcmp(name->lista, elencoliste.liste[i].lista)== 0)
        {
         valore = 0;
         break;
        }
       valore = -1; 
      }
      if(valore < 0 )  // non esiste la lista
       return (&result);
     
      for( i = 0; i<N; i++)
      {
         if(strcmp(name->lista, candidati.candidato[i].lista)== 0)
        {
              result +=  candidati.candidato[i].value;
        }
      }
    return (&result);
    }

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    Originariamente inviato da soulbw
    Per RPC intendo REMOTE PROCEDURE CALL (tipo Sun RPC);
    Lo avevo sospettato ma non vedevo nulla relativo a RPC nel tuo codice ...

    Il problema che hai è semplicemente causato dal fatto che, per le prove, hai usato dei nomi come

    gianluigi piero

    che sono lunghi 15 caratteri e che hai previsto al massimo 15 caratteri per i nomi. Viene quindi copiato il carattere NUL nella prossima locazione in memoria "sporcandola" in maniera del tutto imprevedibile. Ecco che i dati saranno quindi diversi da quelli di prima.

    Aumenta il valore di DIM_NOME o usa nomi più brevi per i test.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  6. #6
    Utente di HTML.it
    Registrato dal
    May 2007
    Messaggi
    49
    Grande, ehehehe che Ceppa che sono non ci stavo pensando per niente heehehehehehe
    Pero' perche' se passo per esempio come primo nome "ceppa" le due printf quella prima di inizializza mi stampa
    ceppa ....quella dopo inizializza non stampa nulla......ma poi quando richiedo un altra volta di ottenere il numero
    di votazioni su un altra lista du quelle due printf una mi stampa il nome della lista inserita prima "ceppa" e la seconda quella nuova....non capisco dov' inghippo.....

  7. #7
    Utente di HTML.it
    Registrato dal
    May 2007
    Messaggi
    49
    Sono qui....nome lista richiesta:cicconi
    inizia la procedura di preparazione di candidati...inizializzato candidato 0
    inizia la procedura di preparazione di candidati...inizializzato candidato 1
    inizia la procedura di preparazione di candidati...inizializzato candidato 2
    inizia la procedura di preparazione di candidati...inizializzato candidato 3
    inizia la procedura di preparazione di candidati...inizializzato candidato 4
    inizia la procedura di preparazione di candidati...inizializzato candidato 5
    inizia la procedura di preparazione di candidati...inizializzato candidato 6
    inizia la procedura di preparazione di candidati...inizializzato candidato 7
    inizia la procedura di preparazione di candidati...inizializzato candidato 8
    inizia la procedura di preparazione di candidati...inizializzato candidato 9
    inizializzato candidato 0
    inizializzato candidato 1
    inizializzato candidato 2
    inizializzato candidato 3
    inizializzato candidato 4
    inizializzato candidato 5
    inizializzato candidato 6
    inizializzato candidato 7
    inizializzato candidato 8
    inizializzato candidato 9
    Riempimento struttura liste e check inizializzazzione.....
    elencoListe 0 esimo: nulla e nulla
    elencoListe 1 esimo: cataldi e cater bruno
    elencoListe 2 esimo: valer e rita d-avorio
    elencoListe 3 esimo: aldi e poiater rino

    Valore di inizial posto ad 1
    Dopo inizializza......nome lista richiesta:cicconi
    Sono qui....nome lista richiesta:cerchio


    inizializ vale 1
    Dopo inizializza......nome lista richiesta:cerchio
    Sono qui....nome lista richiesta:system


    inizializ vale 1
    Dopo inizializza......nome lista richiesta:system
    Sono qui....nome lista richiesta:aldi


    inizializ vale 1

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    A me non succede ... cosa fai tra le chiamate?

    (posta il main del programma di prova)
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    Utente di HTML.it
    Registrato dal
    May 2007
    Messaggi
    49
    codice:
    #include <stdio.h>
    #include <rpc/rpc.h>
    #include"lista.h"
    
    main(int argc, char *argv[])
    {
     CLIENT *cl;
     int *result = NULL;
     char ch;
     NuovoCandidato nuovoCand;
     Input in;
     char * server;
      if(argc< 2)
      {
        printf("\n Errore...to many parametres..");
        exit(1);
      }
      server = argv[1];
    
      cl = clnt_create(server, VOTAZIONIPULITE,VOTAZIONIPULITEVERS, "udp");  // creo gestore di trasporto...
      if(cl == NULL)
      {
        clnt_pcreateerror(server);
        exit(1);
      }
      
      // dati input
      do
      {
        printf("\nDigita B per ottenere il totale voti su una lista \n\n");
        
        ch = getchar();
        fgetc(stdin); // elimino l'invio...
    
        if( ch == 'B')
        {
          printf("Inserisci il nome della lista: ");
          scanf("%s", in.lista);
          fgetc(stdin); // elimino l'invio...
          result = visualizzazzione_voti_lista_1(&in, cl);
        
            if(result == NULL) 
            { 
                 clnt_perror(cl, server); 
                 exit(1); 
            }
    
            if((*result) >= 0)
            {
              printf("\nOperazione completata con successo..voti:%i..", (*result));
            }
            else
            {
              printf("\nErrore nella rpc...");
            }
          
        }
          
      }while(ch != EOF);
    clnt_destroy(cl);
    exit(0);
    
    }

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.