www.pudn.com > TP4_client.rar > TP4_client.c, change:2008-06-03,size:3085b


/*
    BENHADDI Said
    KADIRI Othman
    Groupe 1

			******************Coté client****************************

	Le client prend en parametre le nom ou l'adresse du serveur, le numero de port et le nom du fichier qu'il veut recevoir.
	Ce client envoie au serveur le nom du fichier qu'il veut recevoir, et quand il reçoie la réponse de la part du client, il reçoit ce fichier 		blocs par blocs et le sauvegarde dans un nouveau fichier. 

 */



#include <sys/types.h>      // open
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <sys/stat.h>       // open
#include <fcntl.h>          // open


main (int argc, char *argv[])
{
	//Declaration des variables et structures 
	struct hostent *H;
	int sock;
	struct sockaddr_in serv_addr;
	char Buffer [256];
	char Nom_Fichier[64];
	int ret_recv;
	int ret_send;
	int ret_write;
	int taille;

	// vérification des arguments
	if (argc  4)
	{
		perror("Erreur de parametre: nom serveur, numero du port, nom du fichier\n");
		exit (1);
	}
	
	H = gethostbyname(argv[1]);
	if (H == NULL)
	{ 
		perror("gethostbyname()");
	}
	
	// création de la socket
	sock = socket(AF_INET, SOCK_STREAM, 0);
	if (sock == -1)
	{
		perror("sock()");
		exit (1);
	}

	bzero(&serv_addr, sizeof(serv_addr));
	serv_addr.sin_family = AF_INET;
	serv_addr.sin_port = htons((uint16_t)atoi(argv[2]));/* numero de port passé en argument*/
	memcpy(&serv_addr.sin_addr, H->h_addr, H->h_length);

	// connection au serveur
	if (connect (sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) == -1 )
	{
		perror ("connect()");
		exit(1);
	}

    // Envoie du nom du fichier
        // On suppose que le nom du fichier sera toujours transmis sur 64 octets
    strcpy( Nom_Fichier, argv[3] );
    ret_send = send(sock, Nom_Fichier, 64, 0);
    if( ret_send != 64 )
    {
        perror ("Erreur de l'envoie du nom du fichier");
        exit(1);
    }

    // Réception de la taille du fichier
        // Réception d'un int => programme spécifique 
        // à la plateforme et au codage des entiers
    ret_recv = recv(sock, &taille, sizeof(int), MSG_WAITALL);
    if( ret_recv  0 )
    {
        perror ("Erreur durant la réception de la taille du fichier");
        exit(1);
    }
    printf("Taille du fichier en octet : %i\n",taille);

    if( taille == 0 ) return 0;

    printf("Reception...");
    int file = open( argv[3], O_WRONLY | O_CREAT | O_TRUNC );
    unsigned i = 0 ;

	// boucle de réception du fichier
    for(; i<taille; )
	{
        printf("%i\n",i);
        // Réception du fichier
        ret_recv = recv(sock, &Buffer, 256, 0);

	// vérifictaion de la réception
        if( ret_recv  0 )
        {
            perror ("Erreur de reception du fichier");
            exit(1);
        }

	// ecriture dans le fichier
        ret_write = write( file, Buffer, ret_recv );
        if( ret_write != ret_recv )
        {
            perror ("Erreur d'ecriture du fichier");
            exit(1);
        }

        i += ret_recv ; 
	}  
    printf("envoi terminee\n");
}