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 :

Savoir si un paquet UDP est plus récent qu'un autre


Sujet :

C++

  1. #1
    Membre éprouvé
    Avatar de f-k-z
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Juin 2006
    Messages
    403
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2006
    Messages : 403
    Points : 928
    Points
    928
    Par défaut Savoir si un paquet UDP est plus récent qu'un autre
    Bonsoir à tous,

    Travaillant en ce momment sur un programme d'envoi de donnée à la chaine en UDP depuis un programme serveur, j'aurais besoin de ne réccuper que la trame UDP la plus récente afin de pouvoir l'exploiter à sa réception sur le client.

    Par exemple depuis le serveur j'envoi les donnée suivante:

    Donnée 1
    Donnée 2
    Donnée 3
    Donnée 4
    Donnée 4

    Puis sur le client je recois les données dans cet ordre:

    Donnée 1
    Donnée 3
    Donnée 4
    Donnée 2
    Donnée 5

    Comment faire pour ne pas traiter la donnée 2 vu que j'ai déja reçu la donnée 3 en sachant que je ne connais pas le contenu des données 1 à 5 ?

    Cordialement,

    F-k-z
    GNU/Linux c'est une question de VI ou de MORE.
    http://www.goodbye-microsoft.com
    "Linux is user friendly, its just very selective of its friends*", m'enfou, je suis son pote :p

    Un post vous est utile ou est constructif, ayez le réflexe du +1 pour le contributeur ( C'est gratuit et ça donne l'impression d'être utile :p )
    Le tag et la ne sont pas fait que pour le décor, pensez-y !
    R.I.P. F-k-z 13/06/2006 - 12/10/2011
    *Linux est convivial, il est juste très sélectifs pour ses amis.

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Déjà, en UDP, il n'y a pas d'info qui pourraient t'aider. Le protocole UDP est un protocole sans garantie d'acheminement ni de séquencement.

    C'est donc au niveau applicatif que cela doit se gérer.

    Côté emetteur, je verrai bien un truc qui donne un numéro de séquence dans les données applicatives qui s'incrémente à chaque paquet émis.

    Coté récepteur, tu ne traites le paquet que si le numéro de séquence est strictement supérieur au dernier traité.

    Et un petit cas particulier, si le récepteur recoit un paquet dont le numéro de séquence est 0, il doit resetter le dernier numéro de séquence recu et traiter ce paquet. Cela permet qu'en cas de relancement de l'émetteur et de reprise à 0 des numéro de séquence, le (ou les) récepteur puisse se resynchroniser.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Membre éprouvé
    Avatar de f-k-z
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Juin 2006
    Messages
    403
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2006
    Messages : 403
    Points : 928
    Points
    928
    Par défaut
    Je comptais utiliser un entier non signé long, mais comme j'envoie en continue sur une longuer période n'y a t'il pas de risque je dépasse la limite ?

    Ou si sur le serveur j'arrive à FF FF FF FF FF FF FF FF (capacité maximale de mon unsigned long int, si je ne me trompe pas), je retourne à 0.
    Et avec ta méthode, de faire mon reset, je retombe sur mes pattes, mais s'il y a perte du paquet, chose possible vu que je suis en UDP, il faudrait que je mette une condition du genre,

    Si (paquetprécédant - paquetactuel > 100) {
    Alors je traite le paquetactuel
    Sinon je continue
    }

    Cela parait correct ?
    GNU/Linux c'est une question de VI ou de MORE.
    http://www.goodbye-microsoft.com
    "Linux is user friendly, its just very selective of its friends*", m'enfou, je suis son pote :p

    Un post vous est utile ou est constructif, ayez le réflexe du +1 pour le contributeur ( C'est gratuit et ça donne l'impression d'être utile :p )
    Le tag et la ne sont pas fait que pour le décor, pensez-y !
    R.I.P. F-k-z 13/06/2006 - 12/10/2011
    *Linux est convivial, il est juste très sélectifs pour ses amis.

  4. #4
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    un entier non signé long, c'est 4 octets donc un nombre de 4 milliard (FF FF FF FF et non pas FF FF FF FF FF FF FF FF comme tu l'as écrit).

    A raison d'un paquet par seconde, cela fait 136 ans. Après, à toi de voir si tu risques de faire "tourner" ton compteur.

    Sinon, après, il y a les unsigned long long qui sont sur 64 bits et ce type est maintenant supporté sur beaucoup de plateformes.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  5. #5
    Membre éprouvé
    Avatar de f-k-z
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Juin 2006
    Messages
    403
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2006
    Messages : 403
    Points : 928
    Points
    928
    Par défaut
    C'est vrai qu'avec 4 octets cela devrait suffit, parcontre, question qui n'a rien à voir avec le reseau mais pour la taille des int long int etcetc.
    Le programme suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #include <stdio.h>
     
    int main(){
            printf("ULInt %d\n", sizeof(int));
            printf("ULInt %d\n", sizeof(unsigned int));
            printf("ULInt %d\n", sizeof(unsigned long int));
            printf("ULInt %d\n", sizeof(unsigned long long));
            return 0;
    }
    Me retourne le résultat suivant:
    ULInt 4
    ULInt 4
    ULInt 8
    ULInt 8
    donc un unsigned long int aurait la même taille qu'un unsigned long long ? (testé sur une plateforme 64bits). Est-ce la même chose sur tous les systèmes ou il y a une différence avec une version 32bits
    GNU/Linux c'est une question de VI ou de MORE.
    http://www.goodbye-microsoft.com
    "Linux is user friendly, its just very selective of its friends*", m'enfou, je suis son pote :p

    Un post vous est utile ou est constructif, ayez le réflexe du +1 pour le contributeur ( C'est gratuit et ça donne l'impression d'être utile :p )
    Le tag et la ne sont pas fait que pour le décor, pensez-y !
    R.I.P. F-k-z 13/06/2006 - 12/10/2011
    *Linux est convivial, il est juste très sélectifs pour ses amis.

  6. #6
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Sur ma machine :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        std::cout << sizeof(unsigned long long) << " " << std::numeric_limits<unsigned long long>::max() << std::endl;
        std::cout << sizeof(unsigned long) << " " << std::numeric_limits<unsigned long>::max() << std::endl;
        std::cout << sizeof(unsigned int) << " " << std::numeric_limits<unsigned int>::max() <<std::endl;
        std::cout << sizeof(int) << " " << std::numeric_limits<int>::max() << std::endl;
    Me sort l'output suivant :

    8 18446744073709551615
    4 4294967295
    4 4294967295
    4 2147483647

    Avec mingw sous xp 32bits.
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  7. #7
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Pour moi, XP 32 bits

    unsigned long long int = 64 bits (pareil pour signed long long int)
    unsigned long int = 32 bits (pareil pour signed long int)
    unsigned short int = 16 bits (pareil pour signed short int)
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  8. #8
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Bonjour,
    Comme indiqué précédemment, UDP ne garantie pas le séquencement des trames. Pour le problème de ta numérotation, en général, cela se règle par fenêtre : Si ID_Max-Fenetre<ID_Recu<ID_Max, alors ID_Max reste inchangé, sinon ID_Max = ID_Recu. La taille de la fenêtre est liée à la fréquence des envois et le temps d'acheminement.
    Sur ton problème de taille, le standard n'impose
    (1)qu'une relation d'ordre entre les types : sizeof(char)=1<=sizeof(short int)<=sizeof(int)<=sizeof(long int)<=sizeof(long long int)
    (2) des plages minimums pour les types
    #define SCHAR_MAX +127
    #define SCHAR_MIN -127
    #define SHRT_MAX +32767
    #define SHRT_MIN -32767
    #define INT_MAX +32767
    #define INT_MIN -32767
    #define LONG_MAX +2147483647
    #define LONG_MIN -2147483647
    #define LLONG_MAX +9223372036854775807
    #define LLONG_MIN -9223372036854775807
    A comprendre : int doit pouvoir représenter entre -32767 et +32767. Mais peut très bien représenter entre -2147483647 et +2147483647 car [-32767;+32767] appartient à [-2147483647;+2147483647]
    Donc tu peux très bien avoir sizeof(int)=sizeof(long) ou pas...

    Ensuite :
    -> short == short int
    -> long == long int
    -> long long == long long int
    Donc si on reprend ton exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    sizeof(int) = sizeof(unsigned int) // (1)
    sizeof(unsigned long int) = sizeof(unsigned long) // (2)
    sizeof(unsigned long long) = sizeof(unsigned long long int) // (3)
    La seule garantie que tu as est : (1)<=(2)<=(3).
    Mais tu peux avoir (1)=(2)<(3)
    ou (1)<(2)=(3)

  9. #9
    Membre éprouvé
    Avatar de f-k-z
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Juin 2006
    Messages
    403
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2006
    Messages : 403
    Points : 928
    Points
    928
    Par défaut
    D'accord, merci bien pour toutes ces infos!
    GNU/Linux c'est une question de VI ou de MORE.
    http://www.goodbye-microsoft.com
    "Linux is user friendly, its just very selective of its friends*", m'enfou, je suis son pote :p

    Un post vous est utile ou est constructif, ayez le réflexe du +1 pour le contributeur ( C'est gratuit et ça donne l'impression d'être utile :p )
    Le tag et la ne sont pas fait que pour le décor, pensez-y !
    R.I.P. F-k-z 13/06/2006 - 12/10/2011
    *Linux est convivial, il est juste très sélectifs pour ses amis.

  10. #10
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    Une solution pourrait être de travailler, pour ton compteur, en "binaire réfléchi" (on parle aussi de "gray binaire", plutôt qu'en binaire converti décimal, comme à l'habitude...

    L'idée est de faire en sorte qu'entre deux paquets qui se suivent dans la séquence d'envoi, il n'y ait jamais qu'un seul bit de différence au niveau de la valeur de récupération...
    Voici un tableau comparatif des valeurs de 0 à 7 pour expliquer le principe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    BCD    decimal  gray binaire
    0000  ==> 0  ==>  0000 
    0001  ==> 1  ==>  0001 
    0010  ==> 2  ==>  0011
    0011  ==> 3  ==>  0010 
    0100  ==> 4  ==>  0110 
    0101  ==> 5  ==>  0111
    0110  ==> 6  ==>  0101
    0111  ==> 7  ==>  0100
    ...
    Cela demande bien sur un peu de "gymnastique mentale" pour arriver à créer les valeur (et encore, la logique est finalement simple ) mais la vérification de l'ordre dans lequel les paquets sont reçus s'en trouve simplifiée
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  11. #11
    Membre éprouvé
    Avatar de f-k-z
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Juin 2006
    Messages
    403
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2006
    Messages : 403
    Points : 928
    Points
    928
    Par défaut
    Merci pour l'info, je ne connaissais pas cette technique
    GNU/Linux c'est une question de VI ou de MORE.
    http://www.goodbye-microsoft.com
    "Linux is user friendly, its just very selective of its friends*", m'enfou, je suis son pote :p

    Un post vous est utile ou est constructif, ayez le réflexe du +1 pour le contributeur ( C'est gratuit et ça donne l'impression d'être utile :p )
    Le tag et la ne sont pas fait que pour le décor, pensez-y !
    R.I.P. F-k-z 13/06/2006 - 12/10/2011
    *Linux est convivial, il est juste très sélectifs pour ses amis.

  12. #12
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  13. #13
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Pour le coup des tailles, ça dépend de l'OS:
    • La plupart des systèmes unixoïdes 64 bits utilisent le modèle LP64 (Long and Pointer 64 bits), donc les long int font 64 bits, la même taille que les long long int.
    • Win64 utilise le modèle LLP64 (Long Long and Pointer 64 bits), donc les long int restent à 32 bits, et seuls les long long int font 64.
      Ces tailles sont inchangées entre Win32 et Win64: Seuls changent les pointeurs (et handles Windows) et les types du genre size_t/intptr_t.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. multipathd et oracleasm : l'un est plus rapide que l'autre
    Par exanlb dans le forum Administration
    Réponses: 0
    Dernier message: 04/04/2012, 15h54
  2. Réponses: 12
    Dernier message: 11/02/2009, 14h15
  3. Réponses: 0
    Dernier message: 17/01/2008, 11h09
  4. Réponses: 2
    Dernier message: 21/04/2007, 16h13

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