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 :

htons et ntohs [Non suivi]


Sujet :

Réseau C

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Février 2007
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 141
    Points : 160
    Points
    160
    Par défaut htons et ntohs
    Bonjour,
    je remarque que htons et ntohs appliqués à 0xd6e5, par exemple, font la même chose : 0xe5d6.
    Donc je me dis que ces fonctions sont des alias d'une même fonction ?

    J'ai trouvé dans /usr/include/netinet/in.h:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    ...............
    # else
    #  if __BYTE_ORDER == __LITTLE_ENDIAN
    #   define ntohl(x)	__bswap_32 (x)
    #   define ntohs(x)	__bswap_16 (x)
    #   define htonl(x)	__bswap_32 (x)
    #   define htons(x)	__bswap_16 (x)
    #  endif
    ..............
    question 1:
    dans quel fichier se trouve la fonction _bswap_16(x) ?

    question2:
    quelques lignes plus haut on voit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    ................
    extern uint32_t ntohl (uint32_t __netlong) __THROW __attribute__ ((__const__));
    extern uint16_t ntohs (uint16_t __netshort)
         __THROW __attribute__ ((__const__));
    extern uint32_t htonl (uint32_t __hostlong)
         __THROW __attribute__ ((__const__));
    extern uint16_t htons (uint16_t __hostshort)
         __THROW __attribute__ ((__const__));
    .....................
    dans quel fichier se trouvent ces fonctions et quel rapport avec htons/l ?

    Merci d'avance.

    rutabagas

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2007
    Messages : 66
    Points : 95
    Points
    95
    Par défaut question 1
    bonjour,

    il me semble que pour la question 1 la réponse est byteswap.h

  3. #3
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Citation Envoyé par rutabagas
    je remarque que htons et ntohs appliqués à 0xd6e5, par exemple, font la même chose : 0xe5d6.
    Ben oui, ce n'est pas tres surprenant.
    Donc je me dis que ces fonctions sont des alias d'une même fonction ?
    Cela depend des decisions prises dans l'implementation de ta bibliotheque. En general, on n'a pas a connaitre ce genre de details. Pourquoi veux-tu en savoir plus?

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Février 2007
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 141
    Points : 160
    Points
    160
    Par défaut
    Citation Envoyé par DaZumba
    Ben oui, ce n'est pas tres surprenant.

    Cela depend des decisions prises dans l'implementation de ta bibliotheque. En general, on n'a pas a connaitre ce genre de details. Pourquoi veux-tu en savoir plus?
    En bricolant dans les sockets, je suis tombé sur le problème des machines big-endian ou little-endian(mon laptop acer aspire 5102wlmi amd64) est little-endian et donc je dois utiliser htons, et ce faisant j'ai remis le nez dans l'écriture des nombres entiers et j'aimerais bien savoir comment est faite la fonction __bswap_16 (et en passant la fonction printf aussi) mais je ne sais pas dans quelles library elles se trouvent (les .c pas les .h)
    Si je le savais je chargerais le source debian correspondant ...
    (j'utilise debian)

    merci

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    308
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 308
    Points : 373
    Points
    373
    Par défaut
    Normalement pour printf() et ses copines comme ce sont des grosses fonctions elles ont leur fichier privé à elles... Mais aussi printf() appelle une autre fonction : fprintf() qui elle appelle vfprintf() je crois...
    Donc essaye de trouver vfprintf.c ... Mais je te le dis tout de suite c'est pas jolie à voir

  6. #6
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Citation Envoyé par rutabagas
    Si je le savais je chargerais le source debian correspondant ...
    (j'utilise debian)
    Et ce faisant (au prix de gros efforts), tu rends ton programme completement dependant de la plateforme que tu utilises aujourd'hui. C'est contre-productif. Utilise tranquillement htons() et printf(). Si tu es curieux, tu peux jetter un coup d'oeil mais les implementations sont en general compliquees a lire.

  7. #7
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 986
    Points
    30 986
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par rutabagas
    En bricolant dans les sockets, je suis tombé sur le problème des machines big-endian ou little-endian(mon laptop acer aspire 5102wlmi amd64) est little-endian et donc je dois utiliser htons
    Tu n'utiliseras htons et ntohs QUE si tu dois transférer des short via un réseau TCP/IP.
    1) tu prends ton short que tu transformes en "entier réseau" via htons (host to net short)
    2) cet entier réseau, tu le bennes sur ton TCP/IP
    3) de l'autre coté, tu récupères l'entier réseau
    4) cet entier réseau, tu le convertis en entier host via ntohs (net to host short)

    Avec cette manière, tu t'affranchis des pb de codage little-endian/big-endian (les fonctions se démerdent de leur coté)
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  8. #8
    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 519
    Points
    41 519
    Par défaut
    En fait, tu peux utiliser htons/ntohs pour tout ce qui concerne de la sérialisation de données : Typiquement, réseaux et fichiers.

    Mais pour les fichiers, attention aux brebis galeuses: Beaucoup de formats de fichiers binaires ne suivent pas la convention "réseau" et sont en little-endian. Mais si tu fais un format binaire perso, je te conseille d'utiliser htons/noths.
    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.

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2007
    Messages : 66
    Points : 95
    Points
    95
    Par défaut __bswap_16
    La fonction __bswap_16 est développée dans byteswap.h (l 51) et fait appel à la macro __bswap_constant_16 définie dans le même fichier (ce me semble)...

Discussions similaires

  1. Problème avec ntohs et htons sous VS2010
    Par maestro_mirou dans le forum Visual C++
    Réponses: 2
    Dernier message: 13/03/2012, 08h43
  2. fonction "htons" port client ou serveur
    Par koukou11 dans le forum Développement
    Réponses: 1
    Dernier message: 04/03/2011, 08h10
  3. htons inutile ?
    Par cirdan_elf dans le forum Réseau
    Réponses: 2
    Dernier message: 20/05/2009, 15h31
  4. ntohs en java
    Par andromeda dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 26/07/2007, 09h40
  5. Cross compil "ntohs"
    Par youte dans le forum Linux
    Réponses: 5
    Dernier message: 21/06/2006, 09h28

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