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

Réseau C Discussion :

[socket UDP] Codage BER : Format des Tag (TLG)


Sujet :

Réseau C

  1. #1
    Membre à l'essai
    Inscrit en
    Mai 2005
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 50
    Points : 16
    Points
    16
    Par défaut [socket UDP] Codage BER : Format des Tag (TLG)
    Voila j'effectue un codage BER (Type Longueur Valeur)avec la norme ASN.1 en C pour créer une trame que je place ensuite dans un socket pour l'envoyer sur le réseau.

    Mon problème est que je ne sais pas en quoi encoder les TAG de mes valeurs ( entier, binaire, héxa) pour que lors de l'envoi, mon message soit compris en face.

    J'aimerais bien avoir votre avis

  2. #2
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Lolita59
    Voila j'effectue un codage BER (Type Longueur Valeur)avec la norme ASN.1 en C pour créer une trame que je place ensuite dans un socket pour l'envoyer sur le réseau.

    Mon problème est que je ne sais pas en quoi encoder les TAG de mes valeurs ( entier, binaire, héxa) pour que lors de l'envoi, mon message soit compris en face.

    J'aimerais bien avoir votre avis
    En quoi est-ce une question sur le langage C ? A voir sur Développement réseaux
    Pas de Wi-Fi à la maison : CPL

  3. #3
    Membre à l'essai
    Inscrit en
    Mai 2005
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 50
    Points : 16
    Points
    16
    Par défaut
    Bah le codage se fait en C et c'est ce qui me pose problème

    Comment je dois coder mes tag pour qu'il soit compréhensible une fois envoyés sur le réseau.

  4. #4
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Lolita59
    Bah le codage se fait en C et c'est ce qui me pose problème

    Comment je dois coder mes tag pour qu'il soit compréhensible une fois envoyés sur le réseau.
    Je te l'ai déjà expliqué. Il faut lire la norme qui définit BER et la suivre scrupuleusement. C'est tout. Ca se fait en écrivant les bons bytes dans un tableau de unsigned char. Ensuite tu envoies le tableau sur le réseau avec sendto(). (Bah oui, SNMP, c'est de l'UDP...)
    Pas de Wi-Fi à la maison : CPL

  5. #5
    Membre à l'essai
    Inscrit en
    Mai 2005
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 50
    Points : 16
    Points
    16
    Par défaut
    Ah non tu ne m'as jamais parlé d'Unsigned char pour le type (qui est ma question de base )

    Donc voila j'ai ma réponse

    eh oui je connais BER et je sais que c de l'UDP

    C juste que de l'autre coté il arrive pas a decoder mais c surement parce que j'ai tout mis dans un gros buffer de char avec les tag (en char) et les longueur (en hexa).

    Donc fo faire ça bit par bit....

  6. #6
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Lolita59
    Ah non tu ne m'as jamais parlé d'Unsigned char pour le type (qui est ma question de base )
    Je ne pensais pas que de représenter un flux d'octets par un tableau de unsigned char fût un scoop...
    C juste que de l'autre coté il arrive pas a decoder mais c surement parce que j'ai tout mis dans un gros buffer de char avec les tag (en char) et les longueur (en hexa).

    Donc fo faire ça bit par bit....
    Ou plutôt octet par octet... Mais il peut y avoir des bits à positionner, oui. J'espère que tu connais les opérateurs bit (| & ~ ^ >> <<) et leur utilisation.

    J'insiste, il faut respecter BER à la lettre est c'est assez tordu...
    Pas de Wi-Fi à la maison : CPL

  7. #7
    Membre à l'essai
    Inscrit en
    Mai 2005
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 50
    Points : 16
    Points
    16
    Par défaut
    Pas besoin de scoop pour depanner

    Moi j'avais fait un tableau de char*
    et la ça me met [malformed packet : SNMP]

  8. #8
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Lolita59
    Pas besoin de scoop pour depanner

    Moi j'avais fait un tableau de char*
    et la ça me met [malformed packet : SNMP]
    Un tableau de char * ? Ca fout la trouille...

    Il faut une tableau de unsigned char. Mais ensuite, ce que tu mets dedans doit être correct (OID, données etc.).
    Pas de Wi-Fi à la maison : CPL

  9. #9
    Membre à l'essai
    Inscrit en
    Mai 2005
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 50
    Points : 16
    Points
    16
    Par défaut
    ah bon ? Pkoi ?

    et avec unsigned char, il faut savoir la taille a l'avance non ?

  10. #10
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Lolita59
    ah bon ? Pkoi ?

    et avec unsigned char, il faut savoir la taille a l'avance non ?
    Il faut toujours connaitre la taille à l'avance, on ne va pas allouer une taille au hasard... Tu voulais dire 'connue à la compilation' ?

    Pas forcément, ça peut être un tableau dynamique. De toutes façons, le trap a une taille à peu près connue, non. Tu prends l'ordre de grandeur, tu x 2, tu surveilles le remplissage... Si ça bugue (lilmite atteinte) tu doubles encore la taille...

    Si c'est complètement imprévisible, il faut un tableau dynamique avec realloc() si nécessaire.
    Pas de Wi-Fi à la maison : CPL

  11. #11
    Membre à l'essai
    Inscrit en
    Mai 2005
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 50
    Points : 16
    Points
    16
    Par défaut
    donc un unsigned char* pour une taille dynamique calculée en fonction de la taille des données ?

    Et je me demandais aussi, si j'envoie une structure comportant tout mes champs, ça ne peut pas marcher ?

  12. #12
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Lolita59
    donc un unsigned char* pour une taille dynamique calculée en fonction de la taille des données ?

    Et je me demandais aussi, si j'envoie une structure comportant tout mes champs, ça ne peut pas marcher ?
    Pas portable. Il faut vraiment un tableau de unsigned char
    statique
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unsigned char buffer[1024];
    ou dynamique
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unsigned char *buffer = malloc(1024);
    dans lequel on met les données (octets) unes par unes (ou à coup de memcpy() quand c'est possible...)
    Pas de Wi-Fi à la maison : CPL

  13. #13
    Membre à l'essai
    Inscrit en
    Mai 2005
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 50
    Points : 16
    Points
    16
    Par défaut
    Oki j'avais fait la version dynamique

    une petite dernière question et je t'embete plus

    comment tu mets un int dans un unsigned long, parce que ça me fait disparaitre la valeur chez moi

  14. #14
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Lolita59
    Oki j'avais fait la version dynamique
    Alors pourquoi parlais-tu de 'tableau de char *' ? Ca fait peur !!!
    Citation Envoyé par Lolita59
    une petite dernière question et je t'embete plus

    comment tu mets un int dans un unsigned long, parce que ça me fait disparaitre la valeur chez moi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int x = 123;
    unsigned long y = x;
    Si ceci ne fonctionne pas, c'est qu'il y a un autre problème. Montre ton code.
    Pas de Wi-Fi à la maison : CPL

  15. #15
    Membre à l'essai
    Inscrit en
    Mai 2005
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 50
    Points : 16
    Points
    16
    Par défaut
    zut je voulais dire dans un unsigned char


  16. #16
    Membre à l'essai
    Inscrit en
    Mai 2005
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 50
    Points : 16
    Points
    16
    Par défaut
    Mince j'aurais du relire ce que j'avais écrire au lieu de raffraichir l'écran toutes les minutes

  17. #17
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Lolita59
    zut je voulais dire dans un unsigned char
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    int x = 123;
    if (x < 256)
    {
       unsigned char y = x;
    }
    else
    {
       printf ("%d is too big to fit in an unsigned char portably\n", x);
    }
    Pas de Wi-Fi à la maison : CPL

  18. #18
    Membre à l'essai
    Inscrit en
    Mai 2005
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 50
    Points : 16
    Points
    16
    Par défaut
    Moui en fait le problème c le pointeur lié a ma chaine, tu sais la chaine dans laquelle je met ma trame.

    En fait j'essaye de mettre mon int dans la chaine mais ça marche pas trop

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    unsigned char     *final;
     
     
    final = strcat ( final , tramesnmp.trame.community.longueur);//marche po
     
    //tramesnmp.trame.community.longueur est un int
     
    final = strcat ( final ,(unsigned char*) tramesnmp.trame.community.longueur); //non plus
    je sais je devrais pas utiliser strcat mais je vois pas quoi d'autre

  19. #19
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Lolita59
    Moui en fait le problème c le pointeur lié a ma chaine, tu sais la chaine dans laquelle je met ma trame.
    Je n'ai jamais parlé de chaine, mais de tableau de unsigned char...
    En fait j'essaye de mettre mon int dans la chaine mais ça marche pas trop
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    unsigned char     *final;
    final = strcat ( final , tramesnmp.trame.community.longueur);//marche po
     
    //tramesnmp.trame.community.longueur est un int
    final = strcat ( final ,(unsigned char*) tramesnmp.trame.community.longueur); //non plus
    C'est clair que tu fais un peu n'importe quoi là. Mais tu le connais le C ou pas ? Parce que écrire dans un bloc indéterminé, c'est pas sérieux...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    unsigned char     *final;
    est un pointeur non initialisé. avant de l'utiliser, il faut lui donner une valeur valide. Il n'y a pas cinqante façons de le faire :

    http://emmanuel-delahaye.developpez.....htm#pointeurs

    Ce sont les bases du C. Si tu ne sais pas faire ça, Commence par apprendre le C avant de te lancer dans des projets qui demandent une maitrise de ce langage...

    Après on verra, en fonction de la spec de BER (que tu connais sûrement mieux que moi, enfin, j'espère), quels sont les octets à mettre (ça, c'est de la spec) et comment on les met (ça, c'est du C...).

    Mais commence par fournir un tableau de unsigned char décent, sinon, on ne peut pas avancer. Il peut être plus grand que nécessaire, ça n'a aucune importance. De toutes façons, il faut gérer le nombre d'octets inscrits "à la main"...

    J'ai quand même donné 2 exemples ici :

    http://www.developpez.net/forums/sho...8&postcount=12

    Oser écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    unsigned char     *final;
    final = strcat ( final , tramesnmp.trame.community.longueur);//marche po
    Je trouve ça un peu gonflé quand même. Ou alors si tu ne comprends pas ce que j'écris, pose des questions...
    Pas de Wi-Fi à la maison : CPL

  20. #20
    Membre à l'essai
    Inscrit en
    Mai 2005
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 50
    Points : 16
    Points
    16
    Par défaut
    Oui enfin je te mettais juste le type de mon tableau, j'aurais pu mettre l'allocation c'est sur mais ça servait a rien ici. C'était juste pour montrer sur quoi je travaillais et ce que je voulais faire.

    J'ai osé le faire en pensant que tu comprendrais la question, et non pour que tu dises "il manque des choses dans ta construction" parce que si je dois copier tout mon code on s'en sors pas.

    Ma question ct comment mettre un int dans "unsigned char *chaine", ça ne portait pas sur mon allocation....

Discussions similaires

  1. format de lecture d'un socket udp
    Par fennec62 dans le forum Langage
    Réponses: 6
    Dernier message: 24/11/2008, 23h13
  2. Format des tags Ogg
    Par Pill_S dans le forum Audio
    Réponses: 3
    Dernier message: 17/04/2007, 14h27
  3. [IMPORTANT] Aidez vous des [Tag's]
    Par NoisetteProd dans le forum Bases de données
    Réponses: 1
    Dernier message: 12/02/2005, 15h23
  4. question sur le format des images ..
    Par vbcasimir dans le forum Langages de programmation
    Réponses: 7
    Dernier message: 28/08/2003, 12h08

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