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.








Répondre avec citation



Pas de questions techniques par MP ! Le forum est là pour ça...

Partager