Visualizzazione dei risultati da 1 a 2 su 2
  1. #1
    Utente di HTML.it L'avatar di magsas
    Registrato dal
    Jul 2008
    Messaggi
    15

    [C] Problemi con read e write nei socket

    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.

  2. #2
    Utente di HTML.it L'avatar di magsas
    Registrato dal
    Jul 2008
    Messaggi
    15
    Credo che il mio problema sia la terminazione prematura del client che invia il segnale SIGCHLD al padre.
    Nessuno sa aiutarmi??

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 © 2025 vBulletin Solutions, Inc. All rights reserved.