/* Programma:    cliente.c
*  Autore:       FF
*  Data:         05/02/2006
*  Descr.:       Esempio di cliente TCP che chiede una connessione
*                riceve risposta e termina
*/
#include "utilsock.h"
/* utilsock.h contiene tutte le inclusioni delle altre librerie necessarie
*  e le funzioni di lettura e scrittura dal socket
*/
#define MAX        80

int main(int argc, char *argv[])
{
    int sd,n,i,fd, scritti,letti;
    struct sockaddr_in serv_ind;
    in_port_t porta;
    char buffer[MAX], datil[MAX];
    // controlla argomenti
    if (argc !=4) {
        printf("\nErrore\n");
           printf("Esempio di connessione per traferire file: \n");
        printf("./client ip_servente porta (>1023) nome_file\n");
        exit(-1);
    }
    // apre file per verificarne esistenza
    if ( (fd=open(argv[3], O_RDONLY))<0) {    // O_RDONLY flag def. in <fcntl.h> 
        perror("Errore in apertura file da trasferire");
        exit(-1);
    }    
        // crea socket 
    if ( (sd = socket(PF_INET, SOCK_STREAM, 0)) < 0) {
        perror("Errore in creazione socket");
        exit(-1);
    }
    // indirizzo IP
    memset((void *)&serv_ind, 0, sizeof(serv_ind)); // pulizia ind
    serv_ind.sin_family = AF_INET;                  // ind di tipo INET 
    porta = atoi(argv[2]);
    serv_ind.sin_port = htons(porta);               // porta a cui collegarsi
    /* crea indirizzo usando inet_pton */
    if ( (inet_pton(AF_INET, argv[1], &serv_ind.sin_addr)) <= 0) {
        perror("Errore in creazione indirizzo");
        return -1;
    }
    // stabilisce la connessione
    if (connect(sd, (struct sockaddr *)&serv_ind, sizeof(serv_ind)) < 0) {
        perror("Errore nella connessione");
        exit(-1);
    }
    // legge dal servente
    if ( (n=read(sd, buffer, MAX))<=0) {
        perror("Errore nella read");
        exit(-1);
    }
    buffer[n]='\0';
    if (fputs(buffer, stdout) == EOF) {          
        perror("Errore nella fputs");
        exit(-1);
    }        
    // legge i dati dal file da trasferire e li scive sul socket
    // usa la funzione scrivisock() di utilsock.h        
    while(1) {
        letti=read(fd,datil,MAX);
        if(letti==0)  {
            break;        
        }    
        scritti=scrivisock(sd,datil,letti);
        if (scritti<letti) {
            printf("Errore in scrittura sul socket\n");        
        }    
    }
    printf("File %s trasferito\n",argv[3]);    
    close (sd);
    close (fd);        
    exit(0);
}

