[C] Trasferimento file Client/Server

di il
12 risposte

[C] Trasferimento file Client/Server

Non riesco ad effettuare in modo corretto un trasferimento di un file che si copia dal client al server, il risultato è che o migenera una serie di NUL character (/0) che sembrano tra l'altro apparire in modo random e che non sono presenti nel file di origine, oppure mi trasferisce un file vuoto.
Non sono riuscito a capire il motivo

Vi posto il relativo codice:
Codice Client:
void Trasferisci(int DescrittoreSocket) {
    
    int  fd_sorg,nread;
    struct timeval tv;
	long int tempoTrasferimento;
	char buff[2048];
    DIR *dir;  // puntatore alla directory su cui lavorare
    struct dirent *file_dir; // struttura rappresentate i file della directory
    struct stat info_file; // struttura contenente info sul file
    char *nome_file; // stringa contenente il nome del file

	   gettimeofday(&tv, 0);
	   tempoTrasferimento = tv.tv_sec * 1000000 + tv.tv_usec;

       printf("Client: invio file\n");

		printf("Client: file inviato\n");
		gettimeofday(&tv, 0);
		tempoTrasferimento = (tv.tv_sec * 1000000 + tv.tv_usec)
				- tempoTrasferimento;

		printf("Trasferimento terminato, tempo di trasferimento microsec. %ld, \n",
				tempoTrasferimento);

    // mi sposto nella directory locale dello studente
    chdir(directory);  
    
    // apro la directory specificata passata
    if ((dir = opendir(directory)) == NULL)
        {
            perror("Errore apertura directory!!!");
            exit(-2);
        }

    // scorre la directory appena aperta
    while ((file_dir = readdir(dir)) != NULL) { 
    
        // recupero info sul file specificato da path
        if ((stat(file_dir->d_name, &info_file)) < 0)
              {
                perror("Errore stat!!!");
                exit(-3);
              }
        nome_file = file_dir->d_name; 
        int len =strlen(nome_file);
        nome_file[len]='\0';
 	    
	    // Apro il file per il trasferimento
		if ((fd_sorg = open(nome_file, O_RDONLY)) < 0)
		{
			perror("open file sorgente");
		}
		
		// trasferisco il file
		while ((nread = read(fd_sorg, buff, sizeof(buff)) > 0))
		{
			write(DescrittoreSocket, &buff, nread);
		}
              
    }
    
    // chiude il file
    close(fd_sorg);
        
    // chiude la directory appena utilizzata 
        closedir(dir);

return;
}
Codice Server:
int CopiaFile(int connfd,char path[]) {
   
   char info[2048];
   int fd_dest;
   DIR *dir;  // puntatore alla directory su cui lavorare
   char nome_file[80]; // Stringa contenente il nome file inviato dal client
   
   memset((char *) &nome_file, 0, sizeof(nome_file));
   memset((char *) &info, 0, sizeof(info)); 
   
   //leggo il nome del file
   read(connfd,&nome_file,sizeof(nome_file)); 
   int len=strlen(nome_file);
   nome_file[len] ='\0';
   printf("Il nome del file da trasferire e' %s di lunghezza %d\n",nome_file,len);

   // mi sposto nella directory remota
   chdir(path); 
  
   // apro la directory dello studente
   if ((dir = opendir(path)) == NULL)
   {
       perror("Errore apertura directory!!!");
       exit(-1);
   }
   fd_dest = open(nome_file,O_WRONLY|O_CREAT|O_APPEND,0777);//O_CREAT || O_TRUNC || O_WRONLY);
   if (fd_dest< 0) {
			perror("open file sorgente");
			exit(-1);
      }

   int letti,scritti;

//   while ((letti = read(connfd, &info, sizeof(info)) > 0) ) */
   while (1)
   			{
				
				if((letti=read(connfd, &info, sizeof(info))==0)) {
				     break;
				}     
				printf("info %s\n" , info);    
				printf("info %d\n" , letti);  
				scritti=write(fd_dest, &info, sizeof(info));
				printf("scritti =%d \n",scritti);
				break;
			}
 
  close(fd_dest);

  // chiude la directory appena utilizzata 
  closedir(dir);
 
return 0;

}
Se c'è bisogno di altri frammenti di codice chiedete pure e li posto

12 Risposte

Devi accedere o registrarti per scrivere nel forum
12 risposte