Salve a tutti,
è ormai un bel pò che sto sul problema che ora descriverò e non riesco a venirne a capo.
Devo scrivere un programma client/server che comunichi con socket. Il problema è che i programmi funzionano solo per il primo scambio di informazioni, mentre se ne infischiano di tutte le altre readline e writen (in particolare, il server stampa 'child terminato').
Non credo che possa postarvi tutto il codice, ma mi limito al client e al server. Comunque, tutte le funzioni che uso sono quelle che si utilizzano di solito e si possono trovare sui libri di Stevens e sul Gapil.

Ecco il server:
codice:
#include "basic.h" 
#include "my_signal.h"  

int main(int argc, char **argv){      
     pid_t pid;     
     int lissd, connsd, n, qt, prezzo;     
   
     struct sockaddr_in servaddr, cliaddr;     
     socklen_t sock_len;     
     char recvline[MAXLINE];
     char sendline[MAXLINE];
     char pin[3], codice[3], codp[3];
     char utente[MAXLINE];
     char descr[MAXLINE];
     
     FILE *f,*p;
     
     if ( argc != 2 ) 
  	    err_quit("utilizzo: server <port>");
 	
     if((lissd=socket(AF_INET,SOCK_STREAM,0))<0)
             err_sys("errore socket");
     
     bzero(&servaddr,sizeof(servaddr));
     servaddr.sin_family=AF_INET;
     servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
     servaddr.sin_port=htons(atoi(argv[1]));
     
     if( (bind(lissd, (SA *) &servaddr, sizeof(servaddr))) < 0)
 	    err_sys("errore in bind");

      if( listen(lissd, LISTENQ) < 0 )
         err_sys("errore in listen");

      if( signal(SIGCHLD, gestisci_zombie) == SIG_ERR )
 	    err_sys("errore nella signal");
 	
     for(;;){
         sock_len=sizeof(cliaddr);
         if((connsd=accept(lissd,(SA *)&cliaddr, &sock_len))<0)
             if(errno==EINTR)
                 continue;
             else
                 err_sys("errore accept");
      
     
         printf("Dati del client: %s %d\n",inet_ntoa(cliaddr.sin_addr),ntohs(cliaddr.sin_port));
      
            if( (pid = fork()) == 0 ) {
  			if( close(lissd) == -1 )
 				err_sys("errore in close");
          				
	//doit 		
	    //legge il pin 	
	if((n=readline(connsd, pin, MAXLINE))<0)
		    err_sys("Errore readline 1");
 	    pin[n-1]='\0';
 		     	
	        //apre il file
      if((f=fopen("Clienti.txt","rw"))<0){ 
	        err_sys("errore apertura file");
 	    } 		     

        //scorro il file
       while(!feof(f)){ 
	  fscanf(f,"%s %s", codice, utente); 		
          //printf("-%s- -%s- -%s-\n",codice, utente, pin); 		       
          if(strcmp(codice,pin)==0){ 		 
           sprintf(sendline,"Benvenuto %s", utente); 	
	            break; 		
        } 		
        else { 		    
            sprintf(sendline,"Cliente non trovato");
	        } 		
      } 		     	
	        //Messaggio benvenuto o errore 	 
       if((n=writen(connsd,sendline,strlen(sendline)))<0)
 	            err_sys("Errore writen 1"); 	         	 
           //leggo il nome del client o il codice del prodotto 	
        bzero(&recvline,sizeof(recvline));
        if((n=readline(connsd,recvline,strlen(recvline)))<0)
                     err_sys("Errore readline 2");
        fputs(recvline,stdout);    	    		
	//fine doit 			 		
	if( close(connsd) == -1 ) 		
		err_sys("errore in close");          		
	exit(0);
        }     
if( close(connsd) == -1 ) 	
      err_sys("errore in close");
     } 
}
Ecco il client:
codice:
#include	"basic.h"  

int main(int argc, char **argv) {
 	int			sockd, n;
 	struct sockaddr_in	servaddr;
  	char recvline[MAXLINE];
 	char sendline[MAXLINE];

  	if ( argc != 3 )
   		err_quit("utilizzo: client <IPaddress> <port>");
  	if ( (sockd = socket(AF_INET, SOCK_STREAM, 0)) < 0 )
  		err_sys("errore in socket");

  	bzero(&servaddr, sizeof(servaddr));
 	servaddr.sin_family = AF_INET;
 	servaddr.sin_port   = htons(atoi(argv[2]));
 	servaddr.sin_addr.s_addr = inet_addr(argv[1]);

  	if ( connect(sockd, (SA *) &servaddr, sizeof(servaddr)) < 0 )
 		err_sys("errore in connect");

      //doit
     printf("Inserisci il PIN:");
     fgets(sendline,MAXLINE,stdin);

              //invia il pin
     if((n=writen(sockd,sendline,strlen(sendline)))<0)
         err_sys("Errore nella writen 1");

     if((n=readline(sockd, recvline, MAXLINE))<0)
         err_sys("Errore readline 1");
        
     printf("-%s-\n",recvline);
     
     
        //se il cliente non è registrato
     if(strcmp(recvline,"Cliente non trovato")==0){
         printf("Inserisci il tuo nome:");
         fgets(sendline,MAXLINE,stdin);
     }
    
      recvline[9]='\0';
     if(strcmp(recvline,"Benvenuto")==0){
         printf("Inserisci il codice del prodotto:");
         fgets(sendline,MAXLINE,stdin);
     }
     
         //invio il nome o il codice del prodotto
     if((n=writen(sockd,sendline,strlen(sendline)))<0)
         err_sys("Errore nella writen 1");
     
     //fine doit

  	close(sockd);
 	exit(0);
 }
Ve ne sarei molto grato se mi aiutaste!!! Grazie. Ciao.