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 :

Codage d'un "int" passé par un socket


Sujet :

C++

  1. #1
    Membre habitué Avatar de sylvain.cool
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2006
    Messages
    242
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2006
    Messages : 242
    Points : 158
    Points
    158
    Par défaut Codage d'un "int" passé par un socket
    Bonjour,

    Je dois faire passer un entier d'un programme à un autre.
    Pour cela, j'utilise des sockets.

    Dans le programme émetteur, je fais un truc comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CAsyncSocket remoteSocket;
    int nNombre = 4;
    remoteSocket.SendTo( &nNombre , sizeof(nNombre ), PORTDEST, "127.0.0.1" );
    Le recepteur fais un truc comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int nRead = ReceiveFrom( &cmdBuffer, MAXCMDLENGTH, sIPSource, nPort );
     
    int nCmd = *((int*)cmdBuffer);
    Et ça marche très bien, comme ça.
    Sauf que quand je décris dans un doc, je dis que le paramètre est un entier signé de 4 octet. Mon utilisateur lambda peut donc potentiellement envoyer comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CAsyncSocket remoteSocket;
    char sCmd[MAX_PATH] = "\0\0\0\4";
    remoteSocket.SendTo( &sCmd, sizeof(sCmd), PORTDEST, "127.0.0.1" );
    Et là, ca ne marche plus !

    En effet, dans mon premier cas, le "4" se trouvera dans le premier octet, alors que dans le second, il sera dans le dernier... pourquoi ?

    Pour info, je suis sous XP avec Visual C++.

    Merci.

  2. #2
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    Je n'ai pas bien compris ce que tu veux faire, mais à première vue:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char sCmd[MAX_PATH] = "\0\0\0\4";
    doit être la source du problème. En C et en C++, le char '\0' est un char spécial qui signifie "fin de la chaîne de caractère". Donc à première vue, ce que tu envoies est une chaîne vide.
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    ton problème est un problème d'indianess.
    Il y a 2 architectures principales, le Big indian et le Little indian, qui définissent si le bit de poids fort est au début ou à la fin.

    Voir http://fr.wikipedia.org/wiki/Endianness


    Par contre, tu n'es pas le premier à venir avec ce "problème" ces temps-ci, on sent la période de projets scolaires.
    Mais du coup, il y a déjà multitudes de topics à ce sujets, et autant de réponses et sources de renseignements à utiliser.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  4. #4
    Membre habitué Avatar de sylvain.cool
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2006
    Messages
    242
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2006
    Messages : 242
    Points : 158
    Points
    158
    Par défaut
    Parfait le lien !

    Merci !

  5. #5
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Citation Envoyé par Bousk Voir le message
    Bonjour,

    ton problème est un problème d'indianess.
    Il y a 2 architectures principales, le Big indian et le Little indian, qui définissent si le bit de poids fort est au début ou à la fin.

    Voir http://fr.wikipedia.org/wiki/Endianness


    Par contre, tu n'es pas le premier à venir avec ce "problème" ces temps-ci, on sent la période de projets scolaires.
    Mais du coup, il y a déjà multitudes de topics à ce sujets, et autant de réponses et sources de renseignements à utiliser.
    On rajoute à ça qu'un processeur intel travaille en little endian (byte de poids fort avec l'adresse la plus élevée) tandis qu'en réseau, on travaille en big endian (byte de poids fort avec l'adresse la plus faible). Du coup, les développeurs de la couche socket ont pensé à quelques petits utilitaires pour faire la conversion :

    * ntohs() (network to host short) et son pendant htons().
    * ntohl() (network to host long) et son pendant htonl().

    Ce qu'il faut faire logiquement, c'est (avant d'envoyer la donnée), faire un htonX() [x = s ou l], et lorqu'on la récupère, utiliser la fonction inverse ntohX() [x = s ou l].
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

Discussions similaires

  1. Int 00h : initialisée par le BIOS ou par l'OS ?
    Par Blustuff dans le forum Assembleur
    Réponses: 19
    Dernier message: 24/09/2003, 09h21

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