Salve, sto cercando di fare un server client che faccia semplicemente giocare da client tramite i dati sul server, per lo più è tutto write da server e read da client, pero' mi fa un errore strano che non capisco, mi spiace darvi da leggere 1 codice cosi' lungo ma alla fine è abbastanza banale e di facile comprensione.

la variabile int fine, presente nella funzione impiccato, da server vale 0 nei primi cicli (e cosi' deve valere), il client, non capisco perchè, legge i 4 byte del tipo intero, ma, il valore dell'intero fine non è 0, bensi un numero strano, che cambia, Es. 112301412 o altri.

Nel programma ho messo la lettura da server perchè da client non riusciva, se qualcuno mi scrivesse come farla glie ne sarei grato (testando pero')

P.s. Programma scritto e provato su Mandriva 2010
P.p.s C'è qualche errore anche nelle write del server perchè alla prima iterazione del while funzionano bene le stampe lato client, dalla seconda arrivano scritte parziali.



Server
codice:
#include <sys/types.h> /*libreria per i tipi non primitivi (pid_t) */
#include <unistd.h> /* libreria read, write, close */
#include <arpa/inet.h> /* liberia per gli IP */
#include <sys/socket.h> /* librearia socket */
#include <stdio.h> /* libreria sugli I/O */
#include <stdlib.h> /* libreria exit, atoi */
#include <string.h> /* libreria stringhe */
#include <time.h> /* libreria tempo seed */
#include <errno.h> /* libreria errori */

#define CONNESSIONI_MAX 8
#define PORTA 54321

int Socket (int famiglia, int tipo, int protocollo);
void Bind (int descrittoreSocket, const struct sockaddr * indirizzo, socklen_t len_indirizzo);
void Listen (int descrittoreSocket, int lunghezza_coda);
void impiccato(int da);

int main(int argc, char *argv[])
{
  int descrittoreSocket, descrittoreAccept;
  struct sockaddr_in server, client;
  pid_t pid;
  socklen_t len;
  int risposta, nread, nwrite;
  char nickname[33];
  
  descrittoreSocket=Socket(AF_INET, SOCK_STREAM, 0);

  server.sin_family       = AF_INET;
  server.sin_addr.s_addr  = htonl(INADDR_ANY);
  server.sin_port         = htons(PORTA);
   
  Bind(descrittoreSocket, (struct sockaddr *) &server, sizeof(server));
  Listen(descrittoreSocket, CONNESSIONI_MAX);
  printf("Server up!!!!\n");
  
  while(1)
  {
  len = sizeof(client);
  if ((descrittoreAccept=accept(descrittoreSocket, (struct sockaddr *) &client, &len)) < 0)
   {
     perror("Accept");
     exit(1);
   }
   
   if ((pid = fork()) < 0)
      {
     perror("Fork");
     exit(1);
      }
   
   if (pid == 0)  /* Siamo nel figlio */
    {
     close(descrittoreSocket); 
     nread=read(descrittoreAccept, nickname, 32);
     if (nread < 0)
       exit(1);
     printf("Connessione da parte di 1 client, nome %s, porta %d\n", nickname, ntohs(client.sin_port));

     nread = read(descrittoreAccept, &risposta, sizeof(int));
     if (nread < 0)
       exit(1);
     printf("%d\n",risposta);
     
     switch (risposta)
       {
         case 1:
	 { 
	   printf("scelta 1"); 
	   // tris(descrittoreAccept)    da implmenetare
	   close(descrittoreAccept);
	   exit(1);
	   break;
         }
         case 2: 
	 { 
	   printf("scelta 2");
	   impiccato(descrittoreAccept);
	   close(descrittoreAccept);
	   exit(1);
	   break;
         }
         case 3:
	 { 
	   printf("scelta 3");
	   close(descrittoreAccept);
	   exit(1);
	   break;
         }
       }

   
     close(descrittoreAccept);
     exit(0);
    }
  
  
  }
  close(descrittoreAccept);
  close(descrittoreSocket);

  exit(0);
}



int Socket (int famiglia, int tipo, int protocollo)
{
  int n;
  if (( n = socket(famiglia, tipo, protocollo)) < 0)
    {
      perror("Socket");
      exit(1);
    }
  return (n);
}

void Bind (int descrittoreSocket, const struct sockaddr * indirizzo, socklen_t len_indirizzo)
{
  if (( bind (descrittoreSocket, indirizzo, len_indirizzo) < 0))
    {
      perror("Bind");
      exit(1);
    }
}


void Listen (int descrittoreSocket, int lunghezza_coda)
{
  if ( listen (descrittoreSocket, lunghezza_coda) < 0)
        {
      perror("Listen");
      exit(1);
        }
}

void omino (int errori, int da);
void impiccato(int da)
{
    char *array[]={"cassa","connessione","calciatore","cruciverba","cremonese", "camper"};
    short len_parola, n, i, mancanti;
    short ok=0, errori=0;    //Ok server per vedere se un if e' stato usato
    short parole=6, vite=6;
    char parola_temp[20];   //Parola temporanea contenente la soluzione parziale
    char *lettera;          //La lettera scelta dall'utente
    char *soluzione;        //Gli sara' copiata la soluzione, estraendola dall'array
    char megabuffer[512];
    char occorrenza[20];
    int fine=0, nread;

    lettera=(char *)malloc(1*sizeof(char));         //Allocazione dinamica
    
    
    
    srand((unsigned int)time(0));             //Numeri casuali seed
    n= rand()%parole;                         //Numeri tra 0 e 5
    len_parola=strlen(array[n]);              //Salvataggio lunghezza parola scelta
    mancanti=len_parola;                      //Mancano da scoprire quindi len_parola lettere       
    soluzione=array[n];                       //Salvataggio soluzione
    
    for (i=0; i<len_parola; i++)              //Inizializza a  _ _ _ _ _ _ 
      parola_temp[i]='_';     
      
    while (1)                                   //Ciclo infinito
    {
   //   printf("\nStato della parola: \n");   
      sprintf(megabuffer,"\nStato della parola: \n");

      for (i=0; i<len_parola; i++)       //Stampa la parola parzialmente indovinata
      {

 //       printf("%c", parola_temp[i]);
	sprintf(occorrenza, "%c", parola_temp[i]);
	strcat(megabuffer, occorrenza);
 //       printf(" ");
	sprintf(occorrenza, " ");
	strcat(megabuffer, occorrenza);
      }
      printf(megabuffer);
      write(da, megabuffer, strlen(megabuffer));               //write 1    

      omino(errori, da);                   //Stampa dell'omino write 2
      printf("Vite rimanenti: %d\n\nInserisci una lettera\n", vite-errori);
      sprintf(megabuffer,"Vite rimanenti: %d\n\nInserisci una lettera\n", vite-errori);
      write(da, megabuffer, strlen(megabuffer));               //write 3

      //Manca la read da client
      scanf("%s", lettera);
      

      for (i=0;i<len_parola;i++)       //Controlla 
      {   //Controlla se la lettera e' presente ma sta attento che non sia stata gia' inserita
        if (strncmp(lettera,&soluzione[i],1)==0  && parola_temp[i]=='_')
        {
          parola_temp[i]=*lettera;     //Metto la lettera al posto giusto
          mancanti--;                  //1 lettera in meno da trovare
          ok=1;                        //Ho indovinato 1 lettera
        }
      }
      
      if (ok==0)                          //Non ho indovinato 
        errori++;
      ok=0;                                //Che abbia indovinato o no, riporto a 0

      if (mancanti==0)
      {                               //Ho indovinato tutto
        fine=1;
        write(da, &fine, sizeof(int));           
	
        printf("Complimenti, hai vinto!!!\n"); 
	sprintf(megabuffer, "Complimenti, hai vinto!!!\n");
        write(da, megabuffer, strlen(megabuffer));
	
        for (i=0; i<len_parola; i++)
        {        //Stampa soluzione
          printf("%c", parola_temp[i]);
	  sprintf(occorrenza, "%c", parola_temp[i]);
	  strcat(megabuffer, occorrenza);
          printf(" ");
	  sprintf(occorrenza, " ");
	  strcat(megabuffer, occorrenza);
        } 
        printf("\n");
        sprintf(occorrenza, "\n");
        strcat(megabuffer, occorrenza);
        write(da, megabuffer, strlen(megabuffer));	
        exit(1);                             //Esco dal gioco
      }
      
      if ((vite-errori) == 0)               //Ho finito le vite, game over!
      {
	fine=1;
        write(da, &fine, sizeof(int));
	sprintf(megabuffer, "----  GAME OVER!!!  ----\nLa parola era %s\n", soluzione);
        write(da, megabuffer, strlen(megabuffer));
        printf("----  GAME OVER!!!  ----\n");
	printf("La parola era %s\n", soluzione);
	omino(errori, da);                         //Stampa omino completo
        exit(1);
      }    
     
       printf("FINE: %d\n", fine);                //Qui fine vale 0     
       write(da, &fine, sizeof(int)); 
  }                                        //Chiusura while

}
 
// Function omino tagliata, presente nel secondo post (troppi caratteri)
Client
codice:
#include <sys/types.h> /*libreria per i tipi non primitivi (pid_t) */
#include <unistd.h> /* libreria read, write, close */
#include <arpa/inet.h> /* liberia per gli IP */
#include <sys/socket.h> /* librearia socket */
#include <stdio.h> /* libreria sugli I/O */
#include <stdlib.h> /* libreria exit */
#include <string.h> /* libreria stringhe */
#include <errno.h>

#define PORTA 54321
#define MAX_BUFFER 512

int Socket (int famiglia, int tipo, int protocollo);
int menu (char *nickname,int descrittoreAccept);
void imp(int ds);

int main(int argc, char *argv[])
{
  int descrittoreServer, scelta;
  struct sockaddr_in server;
  char bufferIngresso[MAX_BUFFER], bufferUscita[MAX_BUFFER];
  int nread, nwrite;
  char nickname[33];
  
  descrittoreServer=Socket(AF_INET, SOCK_STREAM, 0);

  server.sin_family     = AF_INET;
  server.sin_port       = htons(PORTA);
  if ( ( inet_pton(AF_INET, argv[1], &server.sin_addr)) <= 0) 
    {
      perror ("Connection error");
      exit(1);
    }

  if (connect(descrittoreServer, (struct sockaddr *) &server, sizeof(server)) < 0)
      {
      perror ("Errore di connessione");
      exit(1);
    }
    

      printf("Ciao, benvenuto sul nostro server di gioco, inserisci il tuo nome\n");
      fgets(nickname, 32, stdin);
 //     printf("nickname: %s", nickname);
  //    printf("lungo: %d", (int)strlen(nickname)-1);
      
      write(descrittoreServer, nickname, strlen(nickname));
      
      do
      {
        scelta = menu(nickname,descrittoreServer);
        if (scelta<1 || scelta > 4)
	  printf("Scelta non consentita!!!\n");
      }
      while (scelta <1 || scelta >4);
      
      write(descrittoreServer, &scelta, sizeof(int));
      
      switch (scelta)
      {
	case 1: break;
	case 2:
	  {
	  imp(descrittoreServer); 
	  break;
	  }
	case 3: 
	   {
	    printf("Disconnesso...\n");
	    break;
	   }
      }        
          
    close(descrittoreServer);
    exit(0);
}
  
  
  
int Socket (int famiglia, int tipo, int protocollo)
{
  int n;
  if (( n = socket(famiglia, tipo, protocollo)) < 0)
    {
      perror("Socket");
      exit(1);
    }
  return (n);
}

int menu (char *nickname,int descrittoreAccept)
{
  int risposta;
  char saluto[170]="\nBenvenuto ";
  strcat(saluto, nickname);
  strcat(saluto, "Premi 1 per giocare a tris \nPremi 2 per il gioco dell'impiccato \nPremi 3 per disconnetterti\n");
  printf("%s",saluto);
  scanf("%d",&risposta);
//  write(descrittoreAccept, saluto, (int)strlen(saluto)-1);
//  nread=read(descrittoreAccept, risp, 1);
//  risp[nread]=0;
//  risposta=atoi(risp);

  return (risposta);
}

void imp(int ds)
{
  char datiIngresso[512];
  char lettera[5];
  int fine=0,nread;

  do
  {
  if ((nread = read(ds, datiIngresso, 256)) < 0)              //Read 1
  {
     perror("Errore lettura 1");
     exit(1);
  } 
  datiIngresso[nread]=0;
  printf("%s",datiIngresso);
    
  if ((nread = read(ds, datiIngresso, 512)) < 0)              //Read 2 (omino)
  {
     perror("Errore lettura 2");
     exit(1);
  } 
  datiIngresso[nread]=0;
  printf("%s",datiIngresso);
  
  if ((nread = read(ds, datiIngresso, 256)) < 0)           //Read 3 (inserisci lettera)
  {
     perror("Errore lettura 3");
     exit(1);
  }
  datiIngresso[nread]=0;
  printf("%s",datiIngresso);

  /*
   fgets(lettera, 2, stdin);  
   write(ds, lettera, strlen(lettera));
   */
       
  if ((nread = read(ds, &fine, sizeof(int)))<0)              //Gioco finito?
    {
     perror("Errore lettura 3");
     exit(1);
    } 
    printf("Nread: %d\n", nread);                //Restituisce 4 (ok)
    printf("Fine: %d\n", fine);         //Numero lungo, sembra una locaz. di memoria....
    

  } 
  while (fine != 0);      

  if (read(ds, datiIngresso, 256) < 0)
  {
     perror("Errore lettura 4");
     exit(1);
  }   
    datiIngresso[nread]=0;
    printf("%s",datiIngresso);
  
  if (read(ds, datiIngresso, 256) < 0)
  {
     perror("Errore lettura 5");
     exit(1);
  } 
    datiIngresso[nread]=0;
    printf("%s",datiIngresso);
  
}