Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    [C] Stato della connessione

    Salve a tutti come esercizio devo realizzare un server iterativo ovvero che accetti una connessione alla volta la gestisca e torni in ascolto sulla stessa porta (non ho ancora fatto il multithreading).
    Lo schema funzionale del mio server è il seguente:

    - Creazione di una socket -
    - Binding della socket specificata -
    - Ascolto sulla porta xxxx -
    while(1) {
    -Accetta connesione ed assegnali un nuovo socket descriptor-
    /*codice di benvenuto*/
    write(buff);

    while(1) {
    -Esegui i servizi disponibili un numero indefinito di volte-
    -Se il client di disconnette chiudi il socket descriptor assegnatoli-
    }

    //finito while interno torna ad accettare nuove connessioni
    }

    Il mio problema consiste nel capire quando il client si disconnette:
    1 - il protocollo che devo implementare non prevede che il client invii una stringa "close" o
    niente del genere (come invio)

    2- devo compilare sotto sistema unix con le seguenti include:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <unistd.h>
    #include <netdb.h>

    In poche parole vorrei riuscire a capire quando il client fa un bel ctrl+c e chiude la connessione in modo da chiudere il socket descriptor, se qualcuno conosce qualche peculiarità utile gli sarei molto grato.

  2. #2
    Up. Non è chiaro?

  3. #3
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    E' chiaro ... ma te ne accorgi dalla recv che restituisce un errore ...

  4. #4
    Intanto grazie per la risposta. Volevo dire che al posto della receive uso la read(); c'è qualche problema ? Ho letto che anch'essa ha un valore di ritorno particolare per l'errore di connessione al client...

    Ho assegnato ad una variabile il valore di ritorno della mia read, se questo valore è minore o uguale a zero allora dico di chiudere la socket; il problema è che la read non entra dentro l'if!


  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Quando parli e commenti del codice, lo devi mostrare ...!

  6. #6
    codice:
    /*Connection Accepting */
    
    memset ( &Client, 0, sizeof(Client) );
    
    while(j<BACKLOG) {
    
    	if (( newsock_fd = accept ( sock_fd, ( struct sockaddr*) &Client ,&addr_len )) <0 ) {
    		
    		perror("Connection Accepting Error");
    
    		close(newsock_fd);
    		
    		break;
    		
    	}
    
    	j++;
    
           /* Write function*/ 
    
    	iwrite = 0;
    		
    	while((iwrite<=3)&&(i=write(newsock_fd,&(buff[iwrite]),1)) >0 ) {
    
    		if(i<0) {
    		 		 
    			perror("Writing error\n\n");
    				
    			close(newsock_fd);
    
    			break;
    			
    		}
    			
    		iwrite+=i;
    		
    	}
    
    	printf("Writing accomplished\n");
    
    
    	/* Read function */        //una volta entrato in questo ciclo vorrei che se la read torna 
    			//un valore negativo si chiudesse la connessione con close(newsock_fd)    
    
    	while(1) {
    	
    		puts("READ ");
    	
    		string_len = STREAM;
    	
    		iread = 0;
    	
    		i=0;
    	
    		
    		while((string_len>iread) && ((i=read(newsock_fd,&(buff[iread]),string_len))> 0 )) {
    		
    		printf("\n%d",i);
    			
    		if(i<=0) {      //non entra in questo if!!!
    			
    				
    			perror("Reading error");
    
    			close(newsock_fd);
    			
    			break;
    			
    		}
    		
    			
    		if(buff[iread-1]=='\0') {
    				
    				
    			printf("Reading accomplished\n");
    			
    				
    			printf("letti %d bytes    tot=%d\n", i, i+iread);
    			
    				
    			fflush(stdout);
    			
    				
    			break;
    		
    		}
    
    		
    		iread+=i;
    		
    		
    	}
    	
    		
    	printf("ho letto: %d bytes\n",i);
    	
    		
    	puts(buff);
    	
    		
    	puts("SONO AI CONTROLLI!!");
    	
    		
    	if((strncmp(buff,"ADD ",4))==0){
    		
    			
    		printf("ADD\n");
    		
    			
    		addmanipulate(buff);
    		
    	}
    	
    		
    	if((strncmp(buff,"DEL ",4))==0){
    			
    			
    		printf("DEL\n");
    			
    			
    		delmanipulate(buff); 
    		
    	}
    	
    	
    		
    	if((strncmp(buff,"LIST",4))==0){
    		
    			
    		printf("LIST\n");
    		
    	/*	listmanipulate();*/
         
    		
    		
    			}
    
    
    		}		
    	}
    }
    
    }
    
    close(sock_fd);
    
    exit(0);
    
    }

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