Bonjour,
J'ai programmé un serveur multi-thread en c++, et l'une des tâche consiste à envoyer un fichier aux clients qui en font la demande. Ca marche correctement avec des fichiers TXT ou PDF. Par rencontre je rencontre deux problèmes lorsque j'essaie d'envoyer des fichiers EXE:
1) La taille du fichier reçu est correcte, mais il est corrompu.
2) Une fois le transfert terminé, il m'est impossible de supprimer du disque le fichier EXE (la source). J'ai essayer en redémarrant Windows, rien à faire. Windows dit que le fichier est utilisé par un processus. La seule façon que j'ai trouvée pour le supprimer est de démarrer en mode sans échec. Le problème apparaît pour tous les fichiers EXE que j'essaye d'envoyer.
Notez que je fractionne le fichier en blocs de 4096 octets afin d'incrémenter une progress bar entre chaque bloc reçu.
Voici le code source pour le serveur:
Voici le code source pour le client:
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 fstream File; File.open("Source.exe",ios::in|ios::binary); File.seekg(0,ios::end); int FileSize=File.tellg(); File.seekg(0,ios::beg); send(Socket,(char *) &FileSize,4,0); // J'informe le client de la taille du fichier qu'il va recevoir char *FileBuffer=new char[FileSize]; File.read(FileBuffer,FileSize); File.close(); int Remaining=FileSize; char *BufPtr=FileBuffer; while (Remaining) if (Remaining>4096) { send(Socket,BufPtr,4096,0); BufPtr+=4096; Remaining-=4096; } else { send(Socket,BufPtr,Remaining,0); Remaining=0; } delete FileBuffer;
Merci d'avance pour votre aide!
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 int FileSize; recv(Client,(char *) &FileSize,4,0); char *FileBuffer=new char[FileSize]; int Remaining=FileSize; char *BufPtr=FileBuffer; while (Remaining) if (Remaining>4096) { recv(Client,BufPtr,4096,0); BufPtr+=4096; Remaining-=4096; } else { recv(Client,BufPtr,Remaining,0); Remaining=0; } fstream File; File.open("Cible.exe",ios::out|ios::binary); File.write(FileBuffer,FileSize); File.close(); delete FileBuffer;
Partager