Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1274 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  [TCP] Perte de donnée lors d'un transfert de fichiers

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[TCP] Perte de donnée lors d'un transfert de fichiers

n°1254170
leyee1603
Posté le 27-11-2005 à 14:35:10  profilanswer
 

Bonjour,
 
Je suis en train d developper une petite application permettant a un client de se connecter a un serveur puis de recuperer des fichiers. J'utilise le protocole TCP. Un probleme intervient lorsque j'essaie de transferer des fichiers de plusieur ko.
Le serveur effectue bien l'envoi de tous les octets du fichiers (la somme des retours du send() est égale a la taille du fichier) mais le client reste bloqué sur un recv() car a un moment dans la boucle while, la valeur de retour de recv n'est pas la taille du tampon (256, 128 ou autres) mais une valeur tres faible, generalement 6.  
 
Voila un bout de code montrant comment se fait l'envoi coté serveur et la reception coté client :
 

Code :
  1. //********Coté serveur**************
  2.    long tailleFichier = getSize(nom);  //renvoie la taille du fichier nom
  3.    char msg[256];
  4.    sprintf(msg, "%d", tailleFichier);
  5.    int lgMsg = strlen(msg);
  6.    int snd = send(descBr, msg, lgMsg, 0); //on envoie la taille du fichier au client
  7.    //Si le fichier existe on l'expédie au client
  8.    if (tailleFichier != -1)
  9.    {
  10.     //Ouverture du fichier a envoyer
  11.     size_t s = nom.size() + 1;
  12.     char * nomFichier = new char[ s ];
  13.     strncpy( nomFichier, nom.c_str(), s );
  14.     FILE* fichier;
  15.     if((fichier=fopen(nomFichier, "rb" )) == NULL)
  16.     {
  17.      cout << "Probleme lors de l'ouverture du fichier." << endl;
  18.     }
  19.      
  20.     //Expedition du fichier
  21.     cout << "Debut de l'expedition du fichier" << endl;
  22.     int octetsEnvoyes = 0;
  23.     int octetsLus;
  24.     char buffer [256];
  25.     while(octetsEnvoyes != tailleFichier)
  26.     {
  27.      octetsLus=fread(buffer, 1, 256, fichier);
  28.      snd = send(descBr, buffer, octetsLus, 0);
  29.      octetsEnvoyes = octetsEnvoyes + snd;
  30.             }
  31.      
  32.     //On fini par fermer le fichier
  33.     fclose(fichier);


 

Code :
  1. //*************Coté client****************
  2.         char  tamponReception [256];
  3. int lgReception = sizeof(tamponReception);
  4. int retourRecv = recv (descLocale, tamponReception, lgReception, 0); //recption de la taille du fichier
  5. tamponReception[lgReception] = '\0';
  6. long tailleFichier= atoi (tamponReception);
  7. //On crée et ouvre le fichier que va nous envoyer le serveur
  8. FILE* fichier;
  9. if((fichier=fopen("./monFic", "wb" )) == NULL)
  10. {
  11.  cout << "impossible de creer le fichier" << endl;
  12. }
  13. long octetsRecus = 0;
  14. while(octetsRecus != tailleFichier)
  15. {
  16.   retourRecv=recv(descLocale,tamponReception, 256, 0);
  17.   octetsRecus = octetsRecus + retourRecv;
  18.   fwrite(tamponReception, 1, retourRecv, fichier);
  19. }
  20. fclose(fichier);


 
Dès que je transfere des fichiers de quelques ko un des buffers n'est rempli qu'a 5 ou 6 char coté client en plein milieur de la transmission alors qu'il devrait etre de 256. J'ai testé avec des valeur beaucoup plus faible de l'ordre de 16 ou 32 et ça plante toujours dès que le fichier est trop gros :/
Quelques remarques bizarre :
- si je met la taille de mon buffer à une valeur <= 7 là c'est ok meme pour des fichiers plus gros (comme un mp3 de qques MO) mais c'est horriblement long;
- lorsque je teste sur des petits fichiers (sources de mon prog par exemple), ça marche tout le temps meme avec des buffers importants
- Pour un meme fichier faisant planter, le buffer de taille anormalement rempli est toujours de la meme taille (5 ou 6)
Je suis dessus depuis hier et rien a faire : j'etais persuader qu'en tcp il n'y avait pas de perte de donnée :/
 
edit : ce probleme n'intervient que lorsque le client et le serveur cohabitent sur une meme machine


---------------
Mon FEEDBACK
mood
Publicité
Posté le 27-11-2005 à 14:35:10  profilanswer
 

n°1254175
Taz
bisounours-codeur
Posté le 27-11-2005 à 14:50:38  profilanswer
 

vérifie TOUJOURS que send ou recv n'a pas retourné -1. Si oui, si errno  est EINTR alors recommence avec un continue. Sinon y a un problème. Lorsque recv renvoie 0, il y a EOF.

n°1254184
leyee1603
Posté le 27-11-2005 à 14:58:39  profilanswer
 

a aucun moment recv ne renvoie -1 , il renvoie une valeur positive tres faible (5 ou 6 par exemple) alors qu'il reste des données a lire. ce qui me tracasse c'est que ce probleme n'apparait pas lorsque les machines sont distantes


---------------
Mon FEEDBACK
n°1254230
Taz
bisounours-codeur
Posté le 27-11-2005 à 16:40:15  profilanswer
 

et alors ? tant que tu reçois des données, c'est bon. Il y a sans doute des interruption qui font que ton appel système revient plus vite. Aucun souci. Code bien et voilà.

n°1254238
leyee1603
Posté le 27-11-2005 à 16:54:18  profilanswer
 

Je vois pas où tu veux en venir : si je fais la somme de mes valeurs de retour de send() j'obtiens une valeur strictement superieure a la somme des valeurs de retour de recv coté client. comme je boucle sur recv tant que je n'ai pas reçu autant d'octets que la taille du fichier, je reste bloqué


---------------
Mon FEEDBACK
n°1254265
Taz
bisounours-codeur
Posté le 27-11-2005 à 17:52:02  profilanswer
 

commence par refaire ton code avec le traitement d'erreur comme je t'ai indiqué.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  [TCP] Perte de donnée lors d'un transfert de fichiers

 

Sujets relatifs
perte de données lors d'un transfert... comprends pasEnregistrer automatiquement des fichiers téléchargés
Transfert de variable dans un popup[VBS - RESOLU] Recherche recursive de fichiers avec caracteres généric
Comment lancer un programme à un temps donnéetransfert de donnés VBA
choix d'une structure de donnée adaptéeTCP ou UDP ?
VBA Excel : gestion de fichiers .xls 
Plus de sujets relatifs à : [TCP] Perte de donnée lors d'un transfert de fichiers


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR