Salut,
J'ai réussi à coder une application Serveur/Client pour le transfert de fichiers. Quand je décide de transférer un seul fichier, il n y a pas de problèmes. Mais quand j'envoie plusieurs à la fois, les fichiers reçus sont parfois corrompus.
Du coté du serveur qui envoie les données tout se passe bien. Il ouvre le dossier indiqué et lit puis transfert tous les fichiers du dossier l'un derrière l'autre (non stop) par paquets de 1024 octets.
Mon problème se situ au niveau du client qui reçoit les données. Quand j'envoie plusieurs fichiers, un coup la réception se passe normalement et quand je décide de relancer le transfert de fichier pour tester le code (mais vraiment sans rien changer au code), les fichiers reçus sont corrompus. parfois certains fichiers, arrivent normalement et les suivants sont corrompus.
Exemple d’envoi de 5 fichiers de 178409 octets :
Mon premier test a marché :
Connection a XXX.XXX.XXX.XXX sur le port 3000
Donnees recues : 178409 octets
Donnees recues : 178409 octets
Donnees recues : 178409 octets
Donnees recues : 178409 octets
Donnees recues : 178409 octets
Mon deuxième test qui dysfonctionne : 5 fichiers envoyé, mais seulement 4 reçus et en plus 3 corrompus.
Connection a XXX.XXX.XXX.XXX sur le port 3000
Donnees recues : 178409 octets
Donnees recues : 179200 octets
Donnees recues : 178642 octets
Donnees recues : 178409 octets
Je ne comprends pas d'où vient ce comportement aléatoire du coté du client. Peut être que la fonction recv() n'arrive pas à suivre le rythme d'envoi des données par le serveur ? Est ce que vous voyez d'où peut venir mon problème ? Je vous laisse la partie de mon code qui reçoit les données si vous pouvez m'aider. merci
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61 DIR* rep = NULL; rep = opendir(DOSSIER); /* Ouverture d'un dossier */ struct dirent* fichierLu = NULL; if (rep == NULL) /* Si le dossier n'a pas pu être ouvert */ { perror("Erreur :"); exit(1); /* (mauvais chemin par exemple) */ } char chemin[100]; int num_fichier=0; while(num_fichier<MAXFICHIERS) { sprintf(chemin,"%s%s%d%s",DOSSIER,"IMG_",num_fichier,".txt"); num_fichier++; /*==============RECEPTION DE DONNEES=============*/ FILE *fichier_src = fopen (chemin, "wb"); if (fichier_src == NULL) { perror ("fopen() "); exit (0); //exit(EXIT_FAILURE); } char buffer[BUFZISE] = {'\0'}; int bytesrecu=0; int totalbytes=0; /* boucle de lecture des paquets de données reçues */ while(totalbytes<TAILLEMAX) { bytesrecu=recv(sock, buffer, BUFZISE, 0); /* Si l'on reçoit des informations : on les stocke dans un fichier*/ if(bytesrecu!= SOCKET_ERROR) { totalbytes = totalbytes + bytesrecu; fwrite(buffer,bytesrecu, 1,fichier_src); } } printf("Donnees recues : %d octets \n", totalbytes); fclose(fichier_src); } } /* sinon, on affiche "Impossible de se connecter" */ else { printf("Impossible de se connecter\n"); }
Partager