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 :

utilisation de chaque bit d'un short.


Sujet :

C++

  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 134
    Par défaut utilisation de chaque bit d'un short.
    bonjour,

    je programme en c++ sur les raw socket. Je souhaite utiliser le protocole TCP.

    voici la déclaration des données membres dans une classe:
    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
     
    unsigned short		tcp_port_src;		//Port source: 16 bits --> Le numéro de port de la source. 
    	unsigned short		tcp_port_dst;		//Port Destinataire: 16 bits --> Le numéro de port du destinataire. 
    	unsigned int		tcp_seq;			//Numéro de séquence: 32 bits --> Le numéro du premier octet de données par rapport au début de la transmission (sauf si SYN est marqué). Si SYN est marqué, le numéro de séquence est le numéro de séquence initial (ISN) et le premier octet à pour numéro ISN+1. 
    	unsigned int		tcp_ack;			//Accusé de réception: 32 bits --> Si ACK est marqué ce champ contient le numéro de séquence du prochain octet que le récepteur s'attend à recevoir. Une fois la connexion établie, ce champ est toujours renseigné. 
    	/*
    	Data Offset: 4 bits --> La taille de l'en-tête TCP en nombre de mots de 32 bits. Il indique là ou commence les données. L'en-tête TCP, dans tous les cas à une taille correspondant à un nombre entier de mots de 32 bits.
     
        Réservé: 6 bits --> Réservés pour usage futur. Doivent nécessairement être à 0. 
     
    	Control Bits : 6 bits
    	URG:  Urgent Pointer field significant
        ACK:  Acknowledgment field significant
        PSH:  Push Function
        RST:  Reset the connection
        SYN:  Synchronize sequence numbers
        FIN:  No more data from sender
    	*/
    	unsigned short		tcp_dataOffset:4, tcp_reserve:6, tcp_Curg:1, tcp_Cack:1, tcp_Cpsh:1, tcp_Crst:1, tcp_Csyn:1, tcp_Cfin:1;
    	unsigned short		tcp_win;			//Fenêtre: 16 bits --> Le nombre d'octets à partir de la position marquée dans l'accusé de réception que le récepteur est capable de recevoir. 
    	unsigned short		tcp_sum;			//Checksum: 16 bits
    	unsigned short		tcp_urgentPointeur;
    j'ai vu que l'on pouvait utiliser tous les bits d'un short, int, char. le tout se réalise avec :nombre ou nombre représente le nombre de bit a utiliser.

    comme dans la déclaration suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unsigned short		tcp_dataOffset:4, tcp_reserve:6, tcp_Curg:1, tcp_Cack:1, tcp_Cpsh:1, tcp_Crst:1, tcp_Csyn:1, tcp_Cfin:1;
    cependant, les questions que je me pose sont comment initialiser chaque valeur?
    doit on utiliser de l'exa, du binaire ou du décimal?

    en ce qui me concerne, chaque valeur sera rentré en décimal, il faudra surement que je les transforme ...

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Pas de champs de bits pour un protocole : L'ordre des champs n'est pas défini, ça dépend donc de l'implémentation (à moins qu'il n'en soit pas du C++ comme du C).
    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.

  3. #3
    Membre chevronné
    Avatar de joellel
    Profil pro
    Inscrit en
    Février 2003
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Février 2003
    Messages : 234
    Par défaut
    Tu travailles en C.
    Donc:
    décimal : valeur
    hexa: 0Xvaleur
    octal: 0valeur

    Le binaire n'existe pas en C

  4. #4
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 134
    Par défaut
    donc en ce qui concerne mes champs de controles, je peux les manipuler comment?

    car ils sont sur un bit!

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Avec les opérateurs binaires (&, |, ^, ~, <<, >>)
    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.

  6. #6
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    std::bitset peut aider, aussi.

  7. #7
    Candidat au Club
    Inscrit en
    Avril 2007
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 3
    Par défaut
    en utilisant l'operateur binaire "|"
    par exemple si tu a un variable comme ca
    unsigned char monvariable;
    le variable possed 8 bit et si tu veut changer le 5em bit en comptant du gauche a droite en 1 tu peut faire monvariable|=16;

    si tu as plusieur variable bit par bit comme ici
    unsigned char a:1;
    unsigned char b:1;
    unsigned char c:1;
    tu peut bien les assigner les valeur 1 par des simple operation comme
    a=1;
    ou a=0;
    bon ma question a moi est esque il faut mettre tout les champ des entete a format mac cad inverser les ordres des bits ou seulement les champs port et ip par htons() et htonl()

  8. #8
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par leonh
    bon ma question a moi est esque il faut mettre tout les champ des entete a format mac cad inverser les ordres des bits ou seulement les champs port et ip par htons() et htonl()
    Réponse de Normand: Ca dépend !
    D'abord je sais pas ce qu'est le format mac... Les machines Apple ont longtemps utilisé des processeurs Motorola utilisant un encodage MSBF (most-significant-byte-first), à l'inverse d'Intel qui préfèrait le LSBF (least-signifcant-byte-first). Mais ca n'a rien à voir avec le systeme d'exploitation, uniquement le processeur. D'ailleurs les récents Mac sur Intel sont peut-être en LSBF...

    Des qu'on commence à communiquer entre deux machines, par contre, il faut définire exactement ce qu'on utilise, et c'est pour ca que j'ai fait cette réponse: ca dépend du protocole... Certains protocoles utilisent LSBF d'autres MSBF. Un peu comme les images RGB ou BGR...

    Pour en revenir au code du message, de toute maniere, il y a risque de probleme sous une autre plateforme (rien ne dit qu'un short fasse 16 bits, et rien n'assure que les bits, dans le cas de controle, seront dans le même ordre).
    Quant à l'IP addresse, elle est pas transformée... elle est toujours dans le même ordre: A.B.C.D Ce n'est que si on la transforme (dans le code) en entier 32 bits qu'elle devient de forme variable !
    Sinon, ca serait la galère en IP6 (et ses 16 octets).

Discussions similaires

  1. varbinary indexé en utilisation masque de bit
    Par soazig dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 16/05/2011, 19h47
  2. [ASE 12.5] Comment connaître l'utilisation de chaque index?
    Par syldup dans le forum Adaptive Server Enterprise
    Réponses: 1
    Dernier message: 31/08/2007, 15h50
  3. extraction de bits d'un short (ou d'un char)
    Par julie20 dans le forum C
    Réponses: 5
    Dernier message: 17/10/2005, 11h47
  4. Accéder facilement à chaque bit d'un byte
    Par bobby-b dans le forum Langage
    Réponses: 6
    Dernier message: 10/07/2004, 14h07
  5. [bit]Mettre un mot de 16 bits (string) en short
    Par -=Spoon=- dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 27/03/2004, 21h07

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