Bonjour,
Je développe une petite dll qui me permet de gérer la com' TCP, et cherche a y implémenter une fonction d'envoi de fichiers.
Je cherche à éviter le File.ReadAllBytes() qui fait automatiquement grimper mon application à 500 Mo d'utilisation de mémoire vive dès que je veux envoyer un fichier de 100 Mo.
J'ai donc réfléchis et cherche à envoyer un fichier par chunk de 1024 bytes, voici le code d'envoi :
De ce coté-là à priori tout marche sans problème.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 byte[] bufferFichier = new byte[1024]; FileStream fs = File.OpenRead(ofd.FileName); int bytesLus; while ((bytesLus= fs.Read(bufferFichier, 0, bufferFichier.Length)) > 0) { client.BeginSend(bufferFichier, 0, bufferFichier.Length, SocketFlags.None, new AsyncCallback(SendCallback), client); }
En revanche je bloque du coté de la réception :
Je reçois entre 4 Mo et 12 Mo, variable, et puis bim, exception fichier en cours d'utilisation.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 private readonly object lockFichier = new object(); private void ReceiveCallback(IAsyncResult ar) { Console.WriteLine("Réception données"); Socket serveur = ar.AsyncState as Socket; int dataClient = serveur.EndReceive(ar); FileStream fs = new FileStream(@"salut.exe", FileMode.Append); lock (lockFichier) { fs.Write(buffer, 0, dataClient); fs.Close(); serveur.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), serveur); } }
Du coup je cherche à comprendre comment éviter ça, j'aimerai éviter de faire un Thread.Sleep(500) par exemple dans ma boucle while de la méthode d'envoi. Voir s'il y a une autre méthode qui puisse directement être implémenté dans la méthode de réception.
Peut être que je comprends mal l'utilisation du lock ...
Merci par avance.
Partager