Pagina 2 di 2 primaprima 1 2
Visualizzazione dei risultati da 11 a 15 su 15
  1. #11
    Utente di HTML.it
    Registrato dal
    Jul 2010
    Messaggi
    466
    Io ho provato con i suggerimenti proposti da YuYevon ed il contenuto del file viene scritto regolarmente..
    Quello che devi rivedere sono i permessi, e il nome del file che viene incollato/scaricato è rappresentato male..
    Non so se sono io che ho modificato male, può essere, comunque, aldilà di non esserci stato dietro, io avrei creato un puntatore FILE *file ed avrei lavorato su quello, leggendo dall'originale, copiando il contenuto in un buffer, passarlo per il socket e scriverlo sul file di destinazione..
    O usare la sendfile..

  2. #12
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Sì ma con quelle correzioni funzionava solo il trasferimento, ora che ho rivisto ci sono errori anche in come è strutturato il server concorrente: una volta creato un nuovo processo, il server deve affidare a quest'ultimo la comunicazione con il client mentre il processo padre deve rimettersi in ascolto sulla socket, quindi la struttura deve essere in linea di massima:

    codice:
    while (1) { /* o for (; ;) */
      ns = accept(...);
    
      if (fork() == 0) {
        /* gestione della connessione da parte del processo figlio */
      } else {
        /* chiusura della socket per la connessione al client */
      }
    Posto il codice con tutte le correzioni, a me funziona... ho impostato come diritti sul file creato quelli di scrittura, lettura ed esecuzione per il proprietario, per il resto niente. Ho eliminato la wait() perché non ho capito a cosa dovesse servire...

    codice:
    #include<stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include<fcntl.h>
    #include <unistd.h>
    #include<sys/types.h>  
    #include <sys/stat.h>
    #include<sys/socket.h>  
    #include<netinet/in.h>  
    #include<netdb.h>  
    #define DIM_BUFF 256
    
    int main (void)
    {
       int sd, ns, fd;
       char buff[DIM_BUFF];
       int fromlen, nread, count=0;
       struct sockaddr_in mio_indirizzo, rem_indirizzo;
       memset((char *)&mio_indirizzo,0,sizeof(struct sockaddr_in));
       fromlen=sizeof(struct sockaddr_in);sd=socket(AF_INET, SOCK_STREAM, 0); /*socket d?ascolto*/
       if (sd<0) {
                    perror ("aperture socket");
                    exit(1);
                    }
                    
       mio_indirizzo.sin_family=AF_INET;
       mio_indirizzo.sin_port=12345;
    
      if(bind(sd,(struct sockaddr *)&mio_indirizzo,sizeof(struct sockaddr_in))<0) {  
        perror("bind");
        exit(1);
      }
      
      listen(sd,5);
      chdir("/home/alessandro/Scrivania");
    
      for(;;) {
    		ns=accept(sd,(struct sockaddr *)&rem_indirizzo,(socklen_t *) &fromlen);
    		
    		if(fork() == 0) {
    			close(sd); /* ricevo nome del file */
    			nread = read(ns, buff, DIM_BUFF);
    			buff[nread] = '\0';
    			printf("il server ha letto %s \n", buff);
    			if((fd=open(buff, O_WRONLY|O_CREAT|O_EXCL, S_IRWXU))<0) {
    				printf("file esiste, non lo sovrascrivo \n");
    				write(ns,"N",1);
    			} else {
    				printf("file non esiste, lo copio dal client \n");
    				write(ns,"S",1);
    				while((nread=read(ns, buff, DIM_BUFF))>0) {
    					write(fd, buff, nread);
    					count+=nread;
    				}
    				close(fd);
    				printf("Copia eseguita di %d byte \n", count);
    				write(ns, &count, sizeof(int));
    			}
    			close(ns);
    			exit(0);
    		} else {
    		  close(ns);
    		}
      }
    
      exit(0);
    }
    codice:
    /*CLIENT*/
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    #include <fcntl.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <netdb.h>
    
    #define DIM_BUFF 256
    
    int main (int argc, char *argv[])
    {
    	int sd, fd, nread;
    	char buff[DIM_BUFF];
    	int copiati;
    	struct hostent *host;								/*ptr a info per host remoto*/
    	struct sockaddr_in rem_indirizzo;						/*per indirizzo socie remota*/
    	if(argc!=3) {
    		printf("Usage Error: %s nomenodo nomefile\n",argv[0]);
    		exit(1);
    	}
    	memset ((char *)&rem_indirizzo,0,sizeof(struct sockaddr_in));			/*Preparazione indirizzo remoto a cui connettersi*/
    	rem_indirizzo.sin_family=AF_INET;
    	host=gethostbyname(argv[1]);
    	if(host==NULL) {
    		printf("%s not found in /etc/hosts\n", argv[1]);
    		exit(2);
    	}
    	bcopy((char *)host ->h_addr, (char *)&rem_indirizzo.sin_addr,host->h_length);	
    	rem_indirizzo.sin_port=12345;
    	sd=socket(AF_INET, SOCK_STREAM,0);
    	if(connect(sd,(struct sockaddr *)&rem_indirizzo,sizeof(struct sockaddr))<0) {
    		perror("Errore in connect");
    		exit(1);
    	}
    	if(write(sd, argv[2],strlen(argv[2]))<0) {
    		perror("write");
    		exit(1);
    	}
    	nread=read(sd,buff, DIM_BUFF);
    	if (nread<0) {
    		perror("read");
    		exit(1);
    	}
    	if(buff[0]=='S') {
    		if((fd=open(argv[2],O_RDONLY))<0) {
    			perror("open");
    			exit(1);
    		}
    		while((nread=read(fd, buff, DIM_BUFF))>0)
    			write(sd, buff, nread);
    		shutdown(sd,1); 							/* ho spedito il file */
    		printf("File spedito \n");
    		memset((char *)buff,0,10);
    		if((nread=read(sd,&copiati,sizeof(int)))<0) {
    			perror("read");
    			exit(1);
    		}
    		write(1,"buff",4);
    		printf("server ha scritto %d byte \n", copiati);
    	} else
    		printf("File esiste,termino \n");
    	close(sd);
    	exit(0);
    }
    every day above ground is a good one

  3. #13
    Si infatti, ora funziona benissimo.
    Il codice è stato ripreso più volte nel tempo e sicuramente ci sono / c'erano delle inconsistenze abbastanza importanti, tra cui la fork che mancava

    Beh che dire.. non so come ringraziarti, spero non ci hai perso troppo tempo sopra

  4. #14
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    La fork() non è che mancasse ma era gestita male... in sostanza tu facevi

    codice:
       if (fork() != 0) {
          /* gestione della connessione */
       }
       close(ns);
       exit(0);
    che presenta due problemi: 1) la gestione della connessione veniva affidata al processo padre e non al figlio (fork() != 0 e non == 0), 2) le due istruzioni immediatamente dopo l'if venivano eseguite da entrambi i processi (a causa della mancanza di "else"), quindi data la presenza di exit(0) sia il padre che il figlio terminavano la loro esecuzione dopo la prima connessione quindi il server non poteva gestirne altre.

    In realtà l'ideale sarebbe anche controllare eventuali errori della fork() verificando che il suo valore non sia < 0 (il che indica appunto un errore) ma vabbè, in condizioni normali è difficile che si verifichino errori del genere.
    every day above ground is a good one

  5. #15
    Volevo scrivere Mancava di correttezza ma nell'agitazione mista a felicità per il funzionamento ho tralasciato.

    Si per questo caso che comunque penso sia semplice la gestione degli errori penso si possa evitare.

    Grazie mille!

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