Problema lettuta file

di il
4 risposte

Problema lettuta file

Buongiorno a tutti, sono alle prime esperienze con la programmazione in C e facendo un esercizio per università sono incappato in un problema che non riesco a risolvere.
struct partecipanti 
{
  char nome[100];
  int pettorale;
};
int nr_pettorale = 0;
int i = 0;
int server_handler (int csk, char *ip_addr, int port)
{
   char buffer [BUFSIZ + 1];
   char nome_partecipante[100];
   struct partecipanti v[100];
   int connessione = 0;
   FILE *fp;
   
   
   printf ("Connesso a %s %d\n", ip_addr, port);
   
   if ((fp = fopen (FILENAME, "r")) != NULL)
   {
     i = 0;
     
     while (fscanf (fp, "%s %d", v[i].nome, &v[i].pettorale) != EOF)
     {
       if (v[i].pettorale > nr_pettorale)
       {
         nr_pettorale = v[i].pettorale;
         i++;
       }
     }
     fclose (fp);     
   }
   
   if ((fp = fopen (FILENAME, "a")) == NULL)
   {
     printf ("Errore di apertura del file\n");
     exit (EXIT_SUCCESS);
   }
   
   while (connessione != 1)
   { 
     printf ("In attesa di un messaggio dal client\n");
     tcp_receive (csk, buffer);
     printf ("Messaggio ricevuto: %s\n", buffer);
     
     if (strcmp (buffer, "ISCRIVI") == 0)
     {
       printf ("In attesa del nome del partecipante\n");
       tcp_receive (csk, nome_partecipante);
       nr_pettorale++;
       strcpy (v[i].nome, nome_partecipante);
       v[i].pettorale = nr_pettorale;
       fprintf(fp, "%s %d\n", v[i].nome, v[i].pettorale);
       fflush(fp);
       sprintf(buffer, "%s iscrizione accettata, numero di pettorale %d\n", v[i].nome, v[i].pettorale);
       tcp_send (csk, buffer);
       i++; 
     }
     
     else if (strcmp (buffer, "LISTA") == 0)
     {
       printf ("E' stata richiesta la lista dei partecipanti\n");
       
       for (i = 0; i < nr_pettorale; i++)
       {
         
         fscanf (fp, "%s %d\n", v[i].nome, &v[i].pettorale);
         sprintf (buffer, "%s\n %d\n", v[i].nome, v[i].pettorale);
         tcp_send (csk, buffer);
       }
       sprintf (buffer, ".");
       tcp_send (csk, buffer);
     }
     
     else if (strcmp (buffer, "BYE") == 0)
     {
       printf ("Connessione con il client chiusa\n");
       tcp_send (csk, "Connessione chiusa\n");
       connessione = 1;
       
     }
     
     else if (strcmp (buffer, "SHUTDOWN") == 0)
     {
       printf ("Connessione chiusa\n");
       tcp_send (csk, "Connessione chiusa\n");
       return 0;
     }
     else 
     {
       printf ("Comando non valido\n");
       tcp_send (csk, "Comando non valido\n");
     }

   } 
   
  
   
   return 1;
}
Il server dovrebbe registrare le iscrizioni da parte dei client; il mio problema è che nel momento in cui vado a chiudere il client lasciando attivo il server quando poi mi connetto con un altro client e chiedo la lista nella prima posizione mi viene stampato il nome e il numero dell'ultimo iscritto.
Tuttavia se chiudo il server e lo riattivo quando poi vado a chiedergli la lista questa mi viene restituita corretta.
L'idea che mi sono fatto quindi è che ci sia un problema a livello di buffer e che quando il server resta attivo se poi gli richiedo la lista ha nel buffer l'ultimo nome iscritto e questo viene stampato sovrascrivendo il primo.
Qualcuno saprebbe aiutarmi?

4 Risposte

  • Re: Problema lettuta file

    Difficile diagnosticare un problema di un codice abbastanza articolato senza eseguirlo. Ma mancano parecchie parti per compilarlo e provarlo.
  • Re: Problema lettuta file

    oregon ha scritto:


    Difficile diagnosticare un problema di un codice abbastanza articolato senza eseguirlo. Ma mancano parecchie parti per compilarlo e provarlo.
    Innanzitutto grazie mille per la risposta, posto di seguito il codice completo
    server:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <ctype.h>
    
    #include "tcpsocketlib.h"
    #define FILENAME "lista_gara1.dat"
    
    
    /* NOTE: to show the interoperability between 
             tcp_ send/receive and getchar/putchar
             in this example the client sends single characters, 
             the server returns the whole string */
    struct partecipanti 
    {
      char nome[100];
      int pettorale;
    };
    int nr_pettorale = 0;
    int i = 0;
    int server_handler (int csk, char *ip_addr, int port)
    {
       char buffer [BUFSIZ + 1];
       char nome_partecipante[100];
       struct partecipanti v[100];
       int connessione = 0;
       FILE *fp;
       
       
       printf ("Connesso a %s %d\n", ip_addr, port);
       
       if ((fp = fopen (FILENAME, "r")) != NULL)
       {
         i = 0;
         
         while (fscanf (fp, "%s %d", v[i].nome, &v[i].pettorale) != EOF)
         {
           if (v[i].pettorale > nr_pettorale)
           {
             nr_pettorale = v[i].pettorale;
             i++;
           }
         }
         fclose (fp);     
       }
       
       if ((fp = fopen (FILENAME, "a")) == NULL)
       {
         printf ("Errore di apertura del file\n");
         exit (EXIT_SUCCESS);
       }
       
       while (connessione != 1)
       { 
         printf ("In attesa di un messaggio dal client\n");
         tcp_receive (csk, buffer);
         printf ("Messaggio ricevuto: %s\n", buffer);
         
         if (strcmp (buffer, "ISCRIVI") == 0)
         {
           printf ("In attesa del nome del partecipante\n");
           tcp_receive (csk, nome_partecipante);
           nr_pettorale++;
           strcpy (v[i].nome, nome_partecipante);
           v[i].pettorale = nr_pettorale;
           fprintf(fp, "%s %d\n", v[i].nome, v[i].pettorale);
           fflush(fp);
           sprintf(buffer, "%s iscrizione accettata, numero di pettorale %d\n", v[i].nome, v[i].pettorale);
           tcp_send (csk, buffer);
           i++; 
         }
         
         else if (strcmp (buffer, "LISTA") == 0)
         {
           printf ("E' stata richiesta la lista dei partecipanti\n");
           
           for (i = 0; i < nr_pettorale; i++)
           {
             
             fscanf (fp, "%s %d\n", v[i].nome, &v[i].pettorale);
             sprintf (buffer, "%s\n %d\n", v[i].nome, v[i].pettorale);
             tcp_send (csk, buffer);
           }
           sprintf (buffer, ".");
           tcp_send (csk, buffer);
         }
         
         else if (strcmp (buffer, "BYE") == 0)
         {
           printf ("Connessione con il client chiusa\n");
           tcp_send (csk, "Connessione chiusa\n");
           connessione = 1;
           
         }
         
         else if (strcmp (buffer, "SHUTDOWN") == 0)
         {
           printf ("Connessione chiusa\n");
           tcp_send (csk, "Connessione chiusa\n");
           return 0;
         }
         else 
         {
           printf ("Comando non valido\n");
           tcp_send (csk, "Comando non valido\n");
         }
    
       } 
       
      
       
       return 1;
    }
    
    int main (int argc, char *argv[])
    {
      if (argc != 3)
      {
        fprintf(stderr,"required arguments: server_ip_address tcp_port\n");
        exit (EXIT_FAILURE);
      }
      
      if (create_tcp_server (argv[1], atoi (argv[2])) < 0)
      {
        fprintf(stderr, "error creating TCP server\n");
        exit(EXIT_FAILURE);
      }
      
      return EXIT_SUCCESS;
    }
    
    void error_handler (const char *message)
    {
       printf ("fatal error: %s\n", message);
       exit (EXIT_FAILURE);
    }
    
    client:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <ctype.h>
    
    #include "tcpsocketlib.h"
    
    
    /* NOTE: to show the interoperability between 
             tcp_ send/receive and getchar/putchar
             in this example the client sends single characters, 
             the server returns the whole string */
    
    int server_handler (int csk, char *ip_addr, int port)
    {
    
    }
    
    
    int main (int argc, char *argv[])
    {
       int sk;
       char buffer [BUFSIZ + 1];
       char nome_partecipante[100];
       int connessione = 0;
    
       if (argc != 3)
       {
          fprintf (stderr, "required arguments: server_ip_address tcp_port\n");
          exit (EXIT_FAILURE);
       }
    
       if ((sk = create_tcp_client_connection (argv[1], atoi (argv[2]))) < 0)
       {
          fprintf (stderr, "cannot open TCP connection\n");
          exit (EXIT_FAILURE);
       }
       
       while (connessione != 1)
       {
          printf ("Lista comandi:\n");
          printf (" - iscrizione:                   ISCRIVI <nome>\n");
          printf (" - lista iscritti:               LISTA\n");
          printf (" - uscita:                       BYE\n");
          printf (" - uscita con shutdown server:   SHUTDOWN\n");
          
          scanf ("%s", buffer);
          
          
          if (strcmp (buffer, "ISCRIVI") == 0)
          {
            tcp_send (sk, buffer);
            printf ("Inserire nome partecipante\n");
            scanf ("%s", nome_partecipante), 
            tcp_send(sk, nome_partecipante);
            printf ("In attesa di risposta dal server\n");
            tcp_receive (sk, buffer);
            printf ("Messaggio ricevuto: %s\n", buffer);
            
          }
          else if (strcmp (buffer, "LISTA") == 0) 
          {
            tcp_send (sk, buffer);
            printf ("In attesa di risposta dal server\n");
            tcp_receive (sk, buffer);
            printf ("Messaggio ricevuto:\n%s\n", buffer);
          }
          else if (strcmp (buffer, "BYE") == 0)
          {
            tcp_send (sk, buffer);
            printf ("In attesa di risposta dal server\n");
            tcp_receive (sk, buffer);
            printf ("%s\n", buffer);
            connessione = 1;
          }
          else if (strcmp (buffer, "SHUTDOWN") == 0)
          {
            tcp_send (sk, buffer);
            printf ("In attesa di risposta dal server\n");
            tcp_receive (sk, buffer);
            printf ("%s\n", buffer);        
            connessione = 1;
          }
          else 
          {
            tcp_send (sk, buffer);
            printf ("In attesa di risposta dal server\n");
            tcp_receive (sk, buffer);
            printf ("Messaggio ricevuto: %s\n", buffer);
          }
          
       } 
       
       
       
       
       return EXIT_SUCCESS;
    
       
    }
    
    
    void error_handler (const char *message)
    {
       printf ("fatal error: %s\n", message);
       exit (EXIT_FAILURE);
    }
    
  • Re: Problema lettuta file

    Scusa ma non ci siamo capiti ... come faccio a provare se non si sa cosa è

    "tcpsocketlib.h"

    né qual è il codice delle funzioni

    tcp_receive
    tcp_send
    create_tcp_server

    ?
  • Re: Problema lettuta file

    oregon ha scritto:


    Scusa ma non ci siamo capiti ... come faccio a provare se non si sa cosa è

    "tcpsocketlib.h"

    né qual è il codice delle funzioni

    tcp_receive
    tcp_send
    create_tcp_server

    ?
    Si scusami errore mio mi sono dimenticato che utilizzo delle librerie che ci ha dato il professore per la scrittura di questi socket

    tcpsocketlib.h :
    
    /*****************************************************************
    
     Copyright 2001   PIER LUCA MONTESSORO
    
     University of Udine
     ITALY
    
     montessoro@uniud.it
     www.montessoro.it
    
     This file is part of a freeware open source software package.
     It can be freely used (as it is or modified) as long as this
     copyright note is not removed.
    
    ******************************************************************/
    
    int create_tcp_client_connection (char *ip_address, int port);
    int create_tcp_server (char *ip_address, int port);
    
    int close_tcp_connection (int sk);
    
    void tcp_set_non_blocking_mode (int sk);
    void tcp_set_blocking_mode (int sk);
    
    int tcp_send (int sk, char *buffer);
    int tcp_binary_send (int sk, char *buffer, int msg_len);
    int tcp_receive (int sk, char *buffer);
    int tcp_binary_receive (int sk, char *buffer);
    
    void tcp_putchar (int sk, int ch);
    int tcp_getchar (int sk);
    
    int server_handler (int sk, char *ip_addr, int port);
    
    void error_handler (const char *message);
    tcpsocketlib.c :
    
    /*****************************************************************
    
     Copyright 2001   PIER LUCA MONTESSORO
    
     University of Udine
     ITALY
    
     montessoro@uniud.it
     www.montessoro.it
    
     This file is part of a freeware open source software package.
     It can be freely used (as it is or modified) as long as this
     copyright note is not removed.
    
    ******************************************************************/
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <netdb.h>
    #include <fcntl.h>
    #include <errno.h>
    #include "tcpsocketlib.h"
    
    /* maximum number of simultaneous connections on the server side */
    #define QUEUELEN       8
    
    
    int create_tcp_client_connection (char *ip_address, int port)
    {
       int sk;
       struct sockaddr_in srv;
    
       /* create a socket descriptor */
       if ((sk = socket (AF_INET, SOCK_STREAM, 0)) < 0)
       {
          error_handler ("socket() [create_tcp_client_connection()]");
          return -1;
       }
    
       /* fill the (used) fields of the socket address with
          the server information (remote socket address) */
       bzero ((char *) &srv, sizeof (srv));
       srv.sin_family = AF_INET;
       srv.sin_addr.s_addr = inet_addr (ip_address);
       srv.sin_port = htons (port);
    
       /* open a connection to the server */
       if (connect (sk, (struct sockaddr *) &srv, sizeof(srv)) < 0)
       {
          error_handler ("connect() [create_tcp_client_connection()]");
          return -1;
       }
    
       return sk;
    }
    
    
    int create_tcp_server (char *ip_address, int port)
    {
       int sk, csk;
       struct sockaddr_in srv, cln;
       socklen_t dimcln;
       int keep_server_alive;
    
       /* create a socket descriptor */
       if ((sk = socket (AF_INET, SOCK_STREAM, 0)) < 0)
       {
          error_handler ("socket() [create_tcp_server()]");
          return -1;
       }
    
       /* fill the (used) fields of the socket address with
          the server information (local socket address) */
       bzero ((char *) &srv, sizeof (srv));
       srv.sin_family = AF_INET;
       srv.sin_addr.s_addr = inet_addr (ip_address);
       srv.sin_port = htons (port);
    
       /* add the local socket address to the socket descriptor */
       if (bind (sk, (struct sockaddr *) &srv, sizeof(srv)) < 0)
       {
          error_handler ("bind() [create_tcp_server()]");
          return -1;
       }
    
       /* make the socket a passive socket (enable the socket 
          accepting connections) */
       if (listen (sk, QUEUELEN) < 0)
       {
          error_handler ("listen() [create_tcp_server()]");
          return -1;
       }
    
       do                              /* server loop */
       {
          dimcln = sizeof (cln);
    
          /* get the next connection request from the queue */
          if ((csk = accept (sk, (struct sockaddr *) &cln, &dimcln)) < 0)
          {
             error_handler ("accept() [create_tcp_server()]");
             return -1;
          }
    
          keep_server_alive = server_handler (csk, inet_ntoa (cln.sin_addr), (int) cln.sin_port);
    
          close_tcp_connection (csk);
    
       } while (keep_server_alive);
    
       return 1;
    }
    
    
    int close_tcp_connection (int sk)
    {
       if (close (sk) != 0)
       {
          error_handler ("close() [close_tcp_connection()]");
          return 0;
       }
    
       return 1;
    }
    
    
    void tcp_set_non_blocking_mode (int sk)
    {
       int flags;
       
       flags = fcntl (sk, F_GETFL, 0);
       fcntl(sk, F_SETFL, flags | O_NONBLOCK);
    
       return;
    }
    
    
    void tcp_set_blocking_mode (int sk)
    {
       int flags;
    
       flags = fcntl (sk, F_GETFL, 0);
       fcntl(sk, F_SETFL, flags & ~O_NONBLOCK);
    
       return;
    }
    
    
    int tcp_send (int sk, char *buffer)
    {
       if (write (sk, buffer, strlen(buffer)) != strlen(buffer))
       {
          error_handler ("write() [tcp_send()]");
          return 0;
       }
    
       return 1;
    }
    
    
    int tcp_binary_send (int sk, char *buffer, int msg_len)
    {
       if (write (sk, buffer, msg_len) != msg_len)
       {
          error_handler ("write() [tcp_binary_send()]");
          return 0;
       }
    
       return 1;
    }
    
    
    int tcp_receive (int sk, char *buffer)
    {
       int dim, flags;
    
       if ((dim = read (sk, buffer, BUFSIZ)) < 0)
       {
          flags = fcntl (sk, F_GETFL, 0);
          if ((flags & O_NONBLOCK) == O_NONBLOCK)
          {   /* non-blocking mode */
             if ((errno == EAGAIN) || (errno == EWOULDBLOCK))
                return 0;
             else
             {
                error_handler ("read() [tcp_receive()]");
                return -1;
             }
          }
          else
          {
             error_handler ("read() [tcp_receive()]");
             return -1;
          }
       }
    
       buffer[dim] = '\0';
       return dim;
    }
    
    
    int tcp_binary_receive (int sk, char *buffer)
    {
       int dim, flags;
    
       if ((dim = read (sk, buffer, BUFSIZ)) < 0)
       {
          flags = fcntl (sk, F_GETFL, 0);
          if ((flags & O_NONBLOCK) == O_NONBLOCK)
          {   /* non-blocking mode */
             if ((errno == EAGAIN) || (errno == EWOULDBLOCK))
                return 0;
             else
             {
                error_handler ("read() [tcp_binary_receive()]");
                return -1;
             }
          }
          else
          {
             error_handler ("read() [tcp_binary_receive()]");
             return -1;
          }
       }
    
       return dim;
    }
    
    
    void tcp_putchar (int sk, int ch)
    {
       char buffer[BUFSIZ + 1];
    
       buffer[0] = ch;
       buffer[1] = '\0';
    
       tcp_send (sk, buffer);
    
       return;
    }
    
    
    int tcp_getchar (int sk)
    {
       static int i = 0;
       static int dim = 0;
       static char buffer[BUFSIZ + 1];
    
       if (i >= dim || buffer[i] == '\0')
       {
          /* reload the buffer */
          if ((dim = tcp_receive (sk, buffer)) == -1)
             return EOF;
          i = 0;
       }
    
       return buffer[i++];
    }
    
Devi accedere o registrarti per scrivere nel forum
4 risposte