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");
}