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);
}