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 :

Lecture TCP d'un bloc supérieur à la MTU


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Janvier 2003
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 26
    Par défaut Lecture TCP d'un bloc supérieur à la MTU
    Bonjour,

    J'aimerais via une liaison TCP lire des trames dont la longueur n'est pas fixe et qui peuvent atteindre environ 8ko.
    Cependant, du fait de la MTU (réglée à 1460 octets), la réception ne peut pas être faite en une seule fois.
    Je ne sais pas comment reconstituer la trame complète sachant que je ne sais pas par avance, la taille de celle-ci.

    Je vous remercie pour votre aide.

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Qu'est-ce que tu utilises pour gérer la communication ? Socket, TcpClient ? Montre ton code.

    Normalement c'est complètement transparent... tu lis un "flux réseau" qui te permet de faire abstraction du fonctionnement sous-jacent. Tu ne devrais pas avoir à te préoccuper de la MTU.

  3. #3
    Membre averti
    Inscrit en
    Janvier 2003
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 26
    Par défaut
    Merci pour votre réponse.

    J'utilise un networkstream d'un TCPClient threadé avec une bouche infini.

    J'ai essayé plusieurs solutions mais voici mon dernier code :
    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
     
      while (run == true)
      {
           if (suspend == false)
           {
                 try
                 {
                      if (_driver.TcpClient.Connected)
                      {
                           ns = new NetworkStream(_driver.TcpClient.Client);
                           if (ns != null)
                           {
                              byte[] tabBytes = new byte[8000]; 
                              nbBytes = 0;
                              int nbDonneesTab = 0;
                              if ((nbDonneesTab = await ns.ReadAsync(buffer, 0, buffer.Length)) > 0)
                                      Console.WriteLine(DateTime.Now + "." + DateTime.Now.Millisecond + " : Reception donnees stream  data ok : " + nbDonneesTab);
                           }
                       }
                   }
            }
    }
    J'ai en réception des trames de 8000 octets
    Voici les logs correspondants :
    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
     
    17/12/2013 08:18:08.628 : Reception donnees stream  data ok : 1460
    17/12/2013 08:18:08.628 : Reception donnees stream  data ok : 1460
    17/12/2013 08:18:08.629 : Reception donnees stream  data ok : 1460
    17/12/2013 08:18:08.630 : Reception donnees stream  data ok : 1460
    17/12/2013 08:18:08.630 : Reception donnees stream  data ok : 1460
    17/12/2013 08:18:08.635 : Reception donnees stream  data ok : 700
     
    17/12/2013 08:18:08.718 : Reception donnees stream  data ok : 1460
    17/12/2013 08:18:08.718 : Reception donnees stream  data ok : 1460
    17/12/2013 08:18:08.719 : Reception donnees stream  data ok : 1460
    17/12/2013 08:18:08.719 : Reception donnees stream  data ok : 1460
    17/12/2013 08:18:08.720 : Reception donnees stream  data ok : 1460
    17/12/2013 08:18:08.721 : Reception donnees stream  data ok : 700
     
    17/12/2013 08:18:08.808 : Reception donnees stream  data ok : 1460
    17/12/2013 08:18:08.808 : Reception donnees stream  data ok : 1460
    17/12/2013 08:18:08.809 : Reception donnees stream  data ok : 1460
    17/12/2013 08:18:08.809 : Reception donnees stream  data ok : 1460
    17/12/2013 08:18:08.810 : Reception donnees stream  data ok : 1460
    17/12/2013 08:18:08.811 : Reception donnees stream  data ok : 700
    La MTU est réglée comme par défaut c'est-à-dire 1460 octets.
    On voit bien que la MTU bloque les trames à une taille maxi de 1460o.

    Avez-vous une idée comment je peux avoir ma trame de 8000 octets en un seul buffer. En sachant que je ne connais pas cette taille normalement, les trames pouvant faire jusqu'à 16ko.

    Pour info complémentaires, je suis sous VS2012 en Windows 7.
    Je vous remercie pour vos réponses

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Mais si tu ne sais pas à l'avance quelle est la taille de la trame à recevoir, comment tu peux savoir où t'arrêter ? C'est une connexion permanente sur laquelle tu reçois régulièrement des trames ? Si oui, il faut forcément un moyen pour marquer la fin d'une trame, ou alors connaitre sa longueur...

  5. #5
    Membre averti
    Inscrit en
    Janvier 2003
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 26
    Par défaut
    Dans le cas où la trame fait moins de 1460 octets, cela fonctionne très bien.

    Le problème lorsque c'est supérieur à 1460o, c'est que je ne sais pas lorsque ma trame originale envoyée est terminée.

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par schub1015 Voir le message
    Dans le cas où la trame fait moins de 1460 octets, cela fonctionne très bien.

    Le problème lorsque c'est supérieur à 1460o, c'est que je ne sais pas lorsque ma trame originale envoyée est terminée.
    Bah de toutes façons NetworkStream.Read ne pourra jamais lire plus que le MTU en un seul coup, si tu attends des trames plus longues c'est à toi d'appeler Read en boucle jusqu'à ce que tu aies reçu toutes les données que tu attendais.

    S'il n'y a pas de moyen de savoir quand la trame se termine, il n'y a pas de solution, car quand il n'y aura plus de données dispo sur le flux, tu ne pourras pas savoir si c'est parce que tu es au bout de la trame, ou parce que le reste des données n'est pas encore arrivé... Dans ce cas c'est le protocole d'échange qui est à revoir.

    Tu es sûr qu'il n'y a pas quelque chose qui t'indique la taille de la trame, ou alors peut-être une séquence qui indique sa fin ?

Discussions similaires

  1. Réponses: 8
    Dernier message: 30/07/2012, 10h14
  2. Sytème de bloc supérieur aux autres
    Par kikou732 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 01/12/2011, 20h47
  3. lecture de fichiers de taille supérieure à 15 MO
    Par ghou67 dans le forum Entrée/Sortie
    Réponses: 12
    Dernier message: 08/04/2008, 14h08
  4. Lecture et écriture de blocs
    Par incognito86 dans le forum C
    Réponses: 10
    Dernier message: 18/02/2007, 16h35
  5. Lecture de fichier par blocs
    Par nicolas66 dans le forum C++
    Réponses: 12
    Dernier message: 11/11/2006, 20h36

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