Bonsoir, je cherche actuellement a envoyer un fichier via socket en TCP. Je lis le fichier par chuncks de 8192 bytes, et pour le dernier chuncks qui ne fait pas toujours 8192, j'envoie bien sûr un paquet avec un buffer réduit (le premier byte du buffer est 1, c'est un 'flag' pour indiquer au récepteur que c'est un fichier, les 8191 bytes restants sont les bytes du fichier) ;
Coté serveur, simple traitement dans le callback de la méthode BeginReceived, à la base le buffer est bien de 8192 :
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 FileStream fs = new FileStream(file, FileMode.Open, FileAccess.Read); int read = 0; long filelenght = fs.Length; byte[] filebuffer = new byte[8192]; int count = 0; while (read < filelenght) { count++; Buffer.SetByte(filebuffer, 0, 1); // Flag fichier if (read + 8192 < filelenght) { read += fs.Read(filebuffer, 1, filebuffer.Length - 1); //Console.WriteLine("[Client] Taille buffer n° " + count + " : " + filebuffer.Length); } else { // dernier buffer filebuffer = new byte[filelenght - read + 1]; Buffer.SetByte(filebuffer, 0, 1); read += fs.Read(filebuffer, 1, filebuffer.Length - 1); //Console.WriteLine("[Client] Dernier buffer : " + filebuffer.Length); } client.BeginSend(filebuffer, 0, filebuffer.Length, SocketFlags.None, new AsyncCallback(SendCallback), client); } fs.Close();
J'ai un petit soucis concernant le dernier paquet, le client envoie un paquet réduit, si par exemple il ne restait de 1200 bytes à lire.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 Client client = ar.AsyncState as Client; int byteReceived = client.Socket.EndReceive(ar); if (byteReceived <= 0) { Console.WriteLine("Deconnexion client"); return; } Console.WriteLine("[Server] Buffer size : " + byteReceived); Array.Resize(ref buffer, byteReceived); buffer = new byte[buffersize]; // buffersize = 8192 client.Socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), client);
Lors de la réception de ce dernier paquet, je peux avoir au hasard en console :
Des fois je peux également avoir ceci :[Server] Buffer size : 8192
[Server] Buffer size : 8192
[...]
[Server] Buffer size : 8192
[Server] Buffer size : 200
[Server] Buffer size : 1000
Alors que coté client, il y a bien eu tout les paquets de 8192 envoyés puis le dernier est bien 1200.[Server] Buffer size : 8192
[Server] Buffer size : 8192
[...]
[Server] Buffer size : 200
[Server] Buffer size : 8192
[Server] Buffer size : 1000
Du coup je me demande où est le problème, vu que dans le second cas, le protocole TCP garantissant l'ordre d'arrivée des paquets, je rencontre quelques soucis à ce niveau-là.
Et dans le second cas, pourquoi le dernier paquet arrive 'fragmenté'.
Dingue je galère depuis des mois a faire une bibliothèque simple permettant d'envoyer fichiers et objets ...
Merci par avance.![]()
Partager