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 :

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);
                }
De ce coté-là à priori tout marche sans problème.

En revanche je bloque du coté de la réception :

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);
            }
        }
Je reçois entre 4 Mo et 12 Mo, variable, et puis bim, exception fichier en cours d'utilisation.

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.