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

Entrée/Sortie Java Discussion :

[Protocole][UDP]comment savoir si la donnée recue est corrompue


Sujet :

Entrée/Sortie Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mars 2005
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 18
    Par défaut [Protocole][UDP]comment savoir si la donnée recue est corrompue
    Saut tout le monde,

    J'essai de simuler un protocole à l'aide de java.

    mais je me suis bloqué sur la maniere dont le savoir peut reconnaitre une donne corrompu et va renvoyer un ACK negatif.

    J'ai voulu envoyé avec DatagramPacket une instance d'un objet de type

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public class Paquet {
       private int seqnum;
       private int checksum;
       private String message ;
    }
    mais DatagramPacket n'accepte pas les types complexes.

    quelqu'un à une idée ?
    Merci

  2. #2
    Membre Expert
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Par défaut
    UDP implémente déjà une checksum. Si un paquet est corrompu, il est rejeté, et le problème revient à traiter un paquet perdu.

    Il y a encore le problème des deux erreurs qui s'annulent, mais ethernet, IP et UDP mettent en oeuvre 3 checksum (pas toujours sur les données, mais bon) et la probabilité d'avoir un paquet corrompu non détecté est très faible (Surtout que les paquets niveau LLC changent en cours de route, et que la checksum est recalculée à chaque routeur).

    En ajoutant une checksum, tu diminues encore cette probabilité, mais je dirais à quoi bon ?
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  3. #3
    Membre averti
    Inscrit en
    Mars 2005
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 18
    Par défaut
    Merci pour la reponse

    Donci j'ai bien compris il suffit juste de traiter les paquets perdus !!

    Ok mais bon, je vux aussi que mes messages arrivent dans un ordre precis, donc il faut que j'ajoute un numero de sequence, mais toujours le meme probleme pas de structure complexe pour l'envoie

  4. #4
    Membre averti
    Inscrit en
    Mars 2005
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 18
    Par défaut
    Ën fait en refléchissant bien je crois que vous avez tort,

    je trouve cette remarque partout dans les sites de cours reseaux :

    fiabilité de transfert à travers UDP: ajouter des fonctions de contrôle au niveau de la couche application pour améliorer la fiabilité recouvrement spécific d’erreurs au niveau applicatif

    : :

  5. #5
    Membre Expert
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Par défaut
    Alors, ressortons les cours de réseau :
    UDP est un protocole de transport, c'est à dire qu'il permet un multiplexage pour la couche application (via le numéro de port), qui permet à deux applications différentes d'utiliser en meme temps le point d'accès IP unique.

    UDP est un protocole sans garantie d'ordre ni de fiabilité : les paquets qui arrivent à destination sont bons (non corrompus), mais ils peuvent ne pas arriver, ou arriver dans le désordre.

    Vu ce que tu dis, tu m'a l'air d'avoir besoin de son rival, TCP. TCP est un protocole de transport avec garantie d'ordre et de fiabilité. Tout paquet émis est reçu au bout d'un certain temps. Les paquets déséquencés sont remis dans l'ordre avant d'être délivrés à l'application.

    En java, TCP s'utilise avec un objet de la classe Socket, et ServerSocket.

    [EDIT]Pour ta remarque : ce que j'ai dit sur la checksum n'engage que moi, mais vu que TCP est le protocole utilisé pour plus de 90% du trafic, si tu as besoin soit de l'ordre, soit de la fiabilité, il vaut mieux l'utiliser (d'autant plus que cela représente des milliers de lignes de code).
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 34
    Par défaut
    Slt.
    Si j'ai bien compris tu cherche a envoyer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public class Paquet { 
       private int seqnum; 
       private int checksum; 
       private String message ; 
    }
    mais DatagramPacket n'accepte pas les types complexes.
    et bien tu pourrais le faire avec DatagramPacket...mais avec des variables public

  7. #7
    Membre averti
    Inscrit en
    Mars 2005
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 18
    Par défaut
    Merci pour les reponses

    Comme j'ai dis le but est de simulele fonctionnement d'un protocole.
    Et par suite j'ai besoin de la corruption des données et du desordre des paquets lors de la reception. c'estr pour cela que je veut utiliser UDP.

    Je reformule dnc le probleme :

    Est se que UDP dans Java (je parle biensure de la classe DatagramPacket ) permet de vehiculer les paquets corrompus.
    Comment envoyé des objets avec DatagramPacket.

    Citation Envoyé par beb-mbs
    et bien tu pourrais le faire avec DatagramPacket...mais avec des variables public
    Je n'ai pas bien compris beb-mbs, qu'est ce que tu entends dire avec variables publics

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 34
    Par défaut
    Slt
    ben disons que j'ai pris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
       private int seqnum; 
       private int checksum; 
       private String message ;
    comme des declarations de variables de la classe Paquet, classe que tu serais obliger de faire si tu veux envoyer en tel Object avec DatagramPacket
    je n'ai par ailleur aucune idee s'il est possible d'envoyer des packets corrompu ???????qu'ils se perdent se doit etre possible, les envoyer et les corrompre, c'est bien au dessus de mes connaissances

  9. #9
    Membre averti
    Inscrit en
    Mars 2005
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 18
    Par défaut
    Salut beb-mbs

    t'as un exemple pour envoyer une instance de classes avec DatagramSocket, la premiere idee qui me vient c'est de serialiser la classe !!!

    Sinon, les pauqets seront corrompus tout seuls lors de leurs transfert. avec quelques pqrqsites dans le reseau.

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 34
    Par défaut
    Slt
    Voila je pensais que tu etais partis pour faire :
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    public class Paquet { 
         public int seqnum = 0; 
         public int checksum = 0; 
         public String message = " ";
     
         public Paquet (int seqnum, int checksum, String message) {
              this.seqnum = seqnum;
              this.checksum = checksum;
              this.message = message;
         }
     
         public Paquet (byte[] b)
              this.seqnum = (int) b[0];
              this.checksum = (int) b[1];
              byte[] post = new byte[b.length-2];
              System.arraycopy(b, 2, post, 0, post.length); 
              this.message = new String(post);
     
         public byte[] getBytes() { 
              byte[] num = { (byte)seqnum, (byte)checksum};
              byte[] post = post.getBytes();
     
              byte[] pack = new byte[ num.length+post.length];
     
              system.arraycopy(num,0,pack,0,num.length);
              System.arraycopy(post,2,pack,num.length,post.length);
     
              return pack;
         }
    }

  11. #11
    Membre averti
    Inscrit en
    Mars 2005
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 18
    Par défaut
    Citation Envoyé par beb-mbs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
              this.seqnum = (int) b[0];
              this.checksum = (int) b[1];
     
              ...............
     
              byte[] num = { (byte)seqnum, (byte)checksum};
              byte[] post = post.getBytes();
     
              byte[] pack = new byte[ num.length+post.length];
     
         }
    }
    Mmm le cast (int) n'est pas evident le checksum et le seqnum depassent la capacite du byte. D'autre part il y aura un probleme lors de la decomposition du paquet lors de la reception vu que la longueur du message n'est pas connu à l'avance.

Discussions similaires

  1. [WP7] Comment savoir que les données sont toutes chargées
    Par Thierry12 dans le forum Windows Phone
    Réponses: 0
    Dernier message: 14/12/2010, 21h12
  2. Réponses: 28
    Dernier message: 29/07/2006, 16h04
  3. Réponses: 2
    Dernier message: 28/01/2006, 14h54
  4. Comment savoir si le bouton d'une fenêtre est enfoncé ?
    Par Lecerf dans le forum Composants VCL
    Réponses: 7
    Dernier message: 21/09/2005, 19h38
  5. Réponses: 19
    Dernier message: 26/01/2005, 10h41

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