Transmission de fichiers

StayCrunchy Messages postés 43 Date d'inscription mercredi 24 novembre 2010 Statut Membre Dernière intervention 26 février 2014 - 25 nov. 2012 à 18:00
StayCrunchy Messages postés 43 Date d'inscription mercredi 24 novembre 2010 Statut Membre Dernière intervention 26 février 2014 - 26 nov. 2012 à 00:24
Bonjour/Bonsoir,

Voila, je rencontre un nouveau problème que je peine à résoudre...
J'ai créé 2 fonctions, envoiBlocs() et receptionBlocs() dont l'une a pour but de transmettre des blocs de données à l'autres. Les données proviennent d'un fichier ouvert par envoiBlocs() et sont envoyées en blocs de taille MAX. ReceptionBlocs() quant à lui créée le fichier à recevoir et copie les blocs reçus les uns après les autres...
Mon problème est que les envois et les réceptions ne semblent pas être synchronisés car je reçois les données plus vite qu'elles ne sont envoyées !!!

Je ne vois pas d'où peut venir l'erreur...
Peut-etre que les fonctions que j'utilise (send/recv) ne sont pas adaptées ? Ou bien est-ce moi qui les utilise mal (sans doute)?
J'ai lu dans le man que l'argument flag permettait certaines choses mais je ne comprend pas bien quoi ...



ENVOIBLOC() :
#include "erreur.h"
#include "comm.h"

#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>

void afficherErreur(int);

int envoiBlocs(int descripteur, char *str_nomFichier, long tailleFichier)
{
FILE *f_fichier = NULL;
char message[MSG], reponse[MIN];
char buffer[MAX];
int nb_lus, compteurBlocs=0, prctg=-1;
int valeurDeRetour = 0, i;
long tailleFichierIncomplet=0;
float pourcentage=0;

errno = 0;
        if( (f_fichier fopen(str_nomFichier, "rb")) NULL)
{	debug("Erreur lors de l'ouverture du fichier "%s".", str_nomFichier);
return -1;
}

printf("Debut de l'upload.\n");
while( (nb_lus = fread(buffer, sizeof(char), MAX, f_fichier)) != 0)
{	memset(reponse, '\0', MIN);
if( recv(descripteur, reponse, MIN, 0) < 0)                          // reception du numero du bloc à envoyer
{	debug("Erreur lors de la reception du temoin de synchronisation.");
valeurDeRetour = -1;
break;
}
if( atoi(reponse) != compteurBlocs)        // si le numéro reçu correspond au numéro du bloc de donnée lues
{	debug("Erreur, desynchronisation de l'envoi.");
valeurDeRetour = -1;
break;
}
                else
{	//Envoie des donnees ecrites dans le buffer/
        if( send(descripteur, buffer, MAX, 0) < 0)
{	debug("Erreur lors de l'envoi du bloc de donnees."); 
valeurDeRetour = -1;
break;
}
}

compteurBlocs++;
tailleFichierIncomplet = tailleFichierIncomplet + nb_lus;
}
if(errno != 0) afficherErreur(errno);
fclose(f_fichier);
return valeurDeRetour;																							 																									 																																			 																																}


RECEPTIONBLOCS():
#include "comm.h"
#include "erreur.h"

#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int copieNBlocFichier(char *, int);

int receptionBlocs(int descripteur, char *str_nomFichier, long tailleFichier)
{
FILE *f_fichier = NULL;
char reponse[MIN], *pSeek;
char buffer[MAX];
long tailleFichierIncomplet;
 	int tailleBloc, count =0, prctg= 0;
 	float pourcentage = 0;
char message[MSG];
int valeurDeRetour = 0, compteurBlocs;

printf("Debut du telechargement.\n");

if( (f_fichier fopen(str_nomFichier, "ab")) NULL)
{	debug("Erreur lors de l'ouverture du fichier "%s".", str_nomFichier);
return -1;
}

errno = 0;
compteurBlocs = 0;
while( tailleFichierIncomplet < tailleFichier)
{

                if( (tailleFichier - tailleFichierIncomplet) >MAX) tailleBloc MAX;
else tailleBloc = tailleFichier - tailleFichierIncomplet;

sprintf(reponse, "%d", compteurBlocs);
if(send(descripteur, reponse, MIN, 0) < 0)                  // j'envoie le numero du bloc que j'attends
{	debug("Echec de l'envoi du temoin de synchronisation.");
valeurDeRetour = -1;
break;
}
if(errno != 0)
{	debug("Erreur : %s (%d).", strerror(errno), errno);
valeurDeRetour = -1;
break;
}

memset(buffer, '\0', MAX);
//Reception des données dans le buffer/
if( recv(descripteur, buffer, MAX, 0) < 0) // Premier char = temoin, les MAX char suivants sont les donnees
{	debug("Erreur lors de la reception du bloc de donnees.");
valeurDeRetour = -1;
break;
}
if(errno != 0)
{	debug("Erreur : %s (%d).", strerror(errno), errno);
valeurDeRetour = -1;
break;
}

if( fwrite(buffer, sizeof(char), tailleBloc, f_fichier) < tailleBloc)
{	debug("Erreur lors de l'ecriture du bloc de donnees.");
valeurDeRetour = -1;
break;
}


tailleFichierIncomplet = tailleFichierIncomplet + tailleBloc;

compteurBlocs++;
}
printf("Fin telechargement.\n");
fclose(f_fichier);

return valeurDeRetour;
}

2 réponses

StayCrunchy Messages postés 43 Date d'inscription mercredi 24 novembre 2010 Statut Membre Dernière intervention 26 février 2014
25 nov. 2012 à 23:58
ps : Le code publié a été modifié, certains commentaires qui y figurent ne veulent plus rien dire... Veuillez ne pas en tenir compte...
0
StayCrunchy Messages postés 43 Date d'inscription mercredi 24 novembre 2010 Statut Membre Dernière intervention 26 février 2014
26 nov. 2012 à 00:24
J'ai essayé d'apporter des modifications au code pour tenter de trouver l'origine du problème.

J'ai fait en sorte de récupérer la valeur de retour de recv() dans la fonction receptionBlocs().
J'ai pu observer plusieurs fois une même erreur:
lorsque recv ne renvoie pas MAX (la taille du bloc recu), la valeur retournée est toujours 1448.
J'ai relancé plusieurs fois le programme. La même "erreur" est survenue à chaque fois, mais pas au même bloc.
Le probleme peut arriver au bloc 100 comme au bloc 2000, la valeur que retournera recv sera 1448 au lieu de MAX (MAX= 2000 au passage).

Cette valeur signifie-t-elle qu'il n'est pas fiable d'envoyer plus de 1448 éléments via la fonction send() ?
0
Rejoignez-nous