Visualizzazione dei risultati da 1 a 3 su 3

Discussione: [c] trasferimento file

  1. #1

    [c] trasferimento file

    ciao!
    Ho un problema con il trasferimento dei tramite i socket. Non riesco a capire perchè ogni tanto le funzioni si blocca in attesa di dati che il server ha spedito, ma che non sono mai arrivati al client... Oppure le arrivano corrotti!
    posto il codice delle due funzioni che uso :

    codice:
    #define SIZE 8192 //8k 
    
    bool recvFile ( int file, int sock, size_t size) {
    
         FILE * log ; 
        char buffer[SIZE_BLOCK];
        ssize_t nread =0, nwrite=0;
        ssize_t tot=size;  
        int  i = 0; 
        memset(buffer, 0, SIZE_BLOCK); 		
        printf("Inizio ricezione del file...."); 
        printf("Devo ricevere %d\n", tot); 	
    	fflush(stdout); 
    	
    	log = fopen("log", "w"); 
    	if ( log == NULL) 
    		perror("Errore log "); 
    
    	fprintf(log , "Test : \n" ); 	
    
    	while(1) { 
    	
    		fprintf(log,"%d\n", tot); 
    		memset(buffer, 0, SIZE_BLOCK);   
    		if (tot <= 0) 
    			break; 
    		nread=recv(sock, buffer, SIZE_BLOCK,0 ); 
    		fprintf(log,"letto %d\n" , nread); 
    		if ( nread < 0) 
    			perror("Errore nella lettura dal socket "); 
    		nwrite=write(file, buffer, nread); 
    		if ( nwrite < 0 ) 
    			perror("Errore nella scrittura del file "); 
    		fprintf(log,"scritto %d\n", nwrite);  
    		tot-=nwrite;
    		fprintf( log,"%d \t", tot);  
    		i++; 
    		if (tot <= 0) 
    			break;  
    	}
    		
    	printf("Ricezione del file terminata\n"); 
    	printf("ricevuti %d ", tot); 
    	fflush(stdout);   
            return 0;
    
    }
    
    
    bool sendFile ( int file, int sock, size_t size) { 
    
    	FILE * log = fopen("log", "w"); 
    	char buffer[SIZE_BLOCK];
            ssize_t nread,nwrite;
        // numero di iterazioni che deve essere fatto per inviare l'intero file 
    	ssize_t tot=size; 
    	memset(buffer, 0, SIZE_BLOCK); 
    		
    	printf("Inizio invio del file......"); 
    		
    	while ( TRUE) { 	
    		fprintf(log, " %d \n", tot); 
    		memset(buffer, 0, SIZE_BLOCK); 
    
    		nread=read(file, buffer, SIZE_BLOCK);
    			// nel caso in cui il file sia un multiplo di 1024
    		if ( nread < 0 ) 
    				perror("Errore lettura dal file"); 
    		fprintf(log, "Ho letto %u\n", nread); 
    		nwrite=send(sock, buffer, nread, 0); 
    			if ( nwrite < 0) 
    				perror("Errore scrittura sul socket");
    		fprintf(log,"Ho scritto %u\n", nwrite); 
    		tot-=nwrite; 
    		fprintf(log, "tot %d\t", tot);  
    		if (tot <= 0) 
    			break; 
    	}
    
    	printf("inviati %d\n", tot);	
    	printf("File inviato\n");
    	fflush(stdout); 
    	return 0;
    }
    qualcuno mi puo aiutare??'

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Probabilmente non basta esaminare solo le due funzioni, ma il progetto in maniera globale ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    si hai ragione! pero essendo il progetto abbastanza grande, non posso postarlo...
    Però mi interessa sapere se queste due funzioni sono corrette, perchè io non ho trovato errori. Se sono certo che queste funzioni sono corrette posso andare a cercare l'errore da qualche altra parte..

    poi controllando i log passo passo mi sono accorto che si perdono sempre 4093 byte, perchè una lettura dal socket è di soli 4099 invece di 8192, quindi ho pensato di mettere come grandezza del buffer 4096 e sembra funzionare! Non riesco a capire il motivo pero di tale comportamento...

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.