IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Paquet TCP fragmenté


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2012
    Messages : 44
    Par défaut Paquet TCP fragmenté
    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) ;

    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();
    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
    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);
    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.
    Lors de la réception de ce dernier paquet, je peux avoir au hasard en console :
    [Server] Buffer size : 8192
    [Server] Buffer size : 8192
    [...]
    [Server] Buffer size : 8192
    [Server] Buffer size : 200
    [Server] Buffer size : 1000
    Des fois je peux également avoir ceci :
    [Server] Buffer size : 8192
    [Server] Buffer size : 8192
    [...]
    [Server] Buffer size : 200
    [Server] Buffer size : 8192
    [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.

    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.

  2. #2
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    Dans une appli TCP, seul le nombre et l'ordre des octets envoyés est identique en émission et en reception.
    Un send peut se retrouver en réception sur un ou plusieurs receive.
    Un receive peut contenir la fin d'un send suivie du début du send suivant.

  3. #3
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2012
    Messages : 44
    Par défaut
    Le fait d'attendre que EndSend soit appellé avant le prochain BeginSend serai une solution ?

Discussions similaires

  1. Réponses: 8
    Dernier message: 30/09/2010, 21h25
  2. Quelle librairie pour forger un paquet TCP ?
    Par Molos dans le forum Réseau/Web
    Réponses: 2
    Dernier message: 21/10/2008, 19h08
  3. conversion de paquets tcp : follow TCP Stream
    Par zoumoizou dans le forum Développement
    Réponses: 0
    Dernier message: 22/02/2008, 22h51
  4. echange de paquets (tcp)
    Par cortex024 dans le forum Développement
    Réponses: 1
    Dernier message: 03/10/2005, 21h40
  5. Programme permettant de créer ses propres paquets TCP/UDP
    Par mat087 dans le forum Développement
    Réponses: 6
    Dernier message: 21/05/2004, 21h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo