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 :

récupérer string par socket TCP


Sujet :

C++

  1. #1
    Membre du Club Avatar de bogsy15
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 147
    Points : 53
    Points
    53
    Par défaut récupérer string par socket TCP
    bonjour,
    J'ai codé un serveur et un client TCP sous C++ builder 6 en mode console. Lorsque que mon client se connecte au serveur, celui-ci fait appel à une méthode qui récupère une valeur (venant d'un micromètre numérique) sous forme d'une string. Cette valeur est ensuite renvoyé au client.
    Mais une fois que le client reçoit la valeur, celle-ci est affiché en caractères spéciaux alors qu'elle est visible au niveau du serveur.
    J'ai essayé différentes méthodes mais sans résultats.

    Pour vous aider, je joins le code du serveur :

    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
     
        ServerSocket serveur(8060);
        ServerSocket new_sock;
        char msg[1];
        string val="002215";
        for(;;)
        {
            serveur.accept(new_sock);
            cout<<"connexion acceptee"<<endl;
            new_sock.set_non_blocking(false);
            new_sock.recvMessage(&msg,sizeof(msg));
     
            if(msg[0] == 'm')
            {
                    cout<<"une mesure est demandee"<<endl;
     
                    new_sock.sendMessage(&val,sizeof(val));
            }
            serveur.Close();
        }
    puis celui du client :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
            ClientSocket client( "10.72.5.225", 8060 );
            char valeur[6];
            char msg[1];
            msg[0] = 'm';
            for(;;)
            {
            client.sendMessage(&msg,sizeof(msg));
            client.recvMessage(valeur,6);
            cout<<valeur;
            }
    voici la valeur que je reçois au niveau du client :

    Donc toute idée sera la bienvenue, je vous remercie d'avance pour votre aide.

    ++ spawnsy

  2. #2
    Membre confirmé Avatar de Mayti4
    Inscrit en
    Février 2004
    Messages
    442
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 442
    Points : 488
    Points
    488
    Par défaut
    serveur.accept(new_sock);
    Tu passes une copie de new_sock.

    new_sock.sendMessage(&val,sizeof(val));
    Tu peux montrer la fonction sendMessage ?
    L'itération est humaine; la récursion, divine.

  3. #3
    Membre du Club Avatar de bogsy15
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 147
    Points : 53
    Points
    53
    Par défaut
    voila le code de la méthode sendMessage() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    int ServerSocket :: sendMessage (const void *p, const int size) const {
     
     if ( ! Socket::send ( p, size ) )
      {
          throw SocketException ( "Impossible d'ecrire dans le socket." );
      }
      return true;
    }

  4. #4
    Membre confirmé Avatar de Mayti4
    Inscrit en
    Février 2004
    Messages
    442
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 442
    Points : 488
    Points
    488
    Par défaut
    C'est val.c_str() qu'il faut envoyer, avec comme taille val.length()
    L'itération est humaine; la récursion, divine.

  5. #5
    Membre du Club Avatar de bogsy15
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 147
    Points : 53
    Points
    53
    Par défaut
    Donc d'apres ce que tu m'as dit, le serveur doit ressembler à ca :

    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
     
    ServerSocket serveur(8060);
        ServerSocket new_sock;
        char msg[1];
        string val="002215";
        for(;;)
        {
            serveur.accept(new_sock);
            cout<<"connexion acceptee"<<endl;
            new_sock.set_non_blocking(false);
            new_sock.recvMessage(&msg,sizeof(msg));
     
            if(msg[0] == 'm')
            {
                    cout<<"une mesure est demandee"<<endl;
                    val.c_str();
                    new_sock.sendMessage(&val,val.length());
            }
            serveur.Close();
        }
    mais malheureusement le client récupère tjs des caractères spéciaux

  6. #6
    Membre confirmé Avatar de Mayti4
    Inscrit en
    Février 2004
    Messages
    442
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 442
    Points : 488
    Points
    488
    Par défaut
    val.c_str();
    new_sock.sendMessage(&val,val.length());
    Non.

    new_sock.sendMessage( val.c_str(), val.length() );
    serveur.accept(new_sock);
    Tu dois modifier new_sock, donc c'est l'adresse qu'il faut passer.
    L'itération est humaine; la récursion, divine.

  7. #7
    Membre du Club Avatar de bogsy15
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 147
    Points : 53
    Points
    53
    Par défaut
    merci ca marche, j'ai bien mes 6 chiffres mais ensuite arrive quelques caractères spéciaux. Il ne faudrait pas mettre un zéro de fin de chaîne ?

  8. #8
    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 : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Citation Envoyé par bogsy15
    merci ca marche, j'ai bien mes 6 chiffres mais ensuite arrive quelques caractères spéciaux. Il ne faudrait pas mettre un zéro de fin de chaîne ?
    Si.

  9. #9
    Membre du Club Avatar de bogsy15
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 147
    Points : 53
    Points
    53
    Par défaut
    par contre je ne sais plus trop comment faire. Si quelqu'un pouvais m'aider ca serai sympa

  10. #10
    Membre confirmé Avatar de Mayti4
    Inscrit en
    Février 2004
    Messages
    442
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 442
    Points : 488
    Points
    488
    Par défaut
    Citation Envoyé par bogsy15
    par contre je ne sais plus trop comment faire. Si quelqu'un pouvais m'aider ca serai sympa
    Tu envoies val.length() + 1.

    char valeur[7];
    ...
    client.recvMessage( valeur, sizeof(valeur) );
    L'itération est humaine; la récursion, divine.

  11. #11
    Membre du Club Avatar de bogsy15
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 147
    Points : 53
    Points
    53
    Par défaut
    j'ai fait ce que tu m'as dit mayti4 mais ca ne change rien

  12. #12
    Membre confirmé Avatar de Mayti4
    Inscrit en
    Février 2004
    Messages
    442
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 442
    Points : 488
    Points
    488
    Par défaut
    Citation Envoyé par bogsy15
    j'ai fait ce que tu m'as dit mayti4 mais ca ne change rien
    Bizarre, montre ton code.
    L'itération est humaine; la récursion, divine.

  13. #13
    Membre du Club Avatar de bogsy15
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 147
    Points : 53
    Points
    53
    Par défaut
    le serveur :

    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
     
        ServerSocket serveur(8060);
        ServerSocket new_sock;
        char msg[1];
        string val="321534";
     
        for(;;)
        {
            serveur.accept(new_sock);
            cout<<"connexion acceptee"<<endl;
            new_sock.set_non_blocking(false);
            new_sock.recvMessage(&msg,sizeof(msg));
     
            if(msg[0] == 'm')
            {
                    cout<<"une mesure est demandee"<<endl;
                    new_sock.sendMessage(val.c_str(), (val.length() + 1));
            }
     
            serveur.Close();
    Le client :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    ClientSocket client( "10.72.5.225", 8060 );
            char valeur[7];
            char msg[1];
            msg[0] = 'm';
            for(;;)
            {
            client.sendMessage(&msg,sizeof(msg));
            client.recvMessage(valeur,sizeof(valeur));
            cout<<valeur;
            }

  14. #14
    Membre confirmé Avatar de Mayti4
    Inscrit en
    Février 2004
    Messages
    442
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 442
    Points : 488
    Points
    488
    Par défaut
    Je ne vois pas d'erreurs.

    Tu peux toujours mettre le 0 dans la partie client :

    char valeur[7] = {0};
    L'itération est humaine; la récursion, divine.

  15. #15
    Membre du Club Avatar de bogsy15
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 147
    Points : 53
    Points
    53
    Par défaut
    en fin de compte ca marche. C'était moi qui avait testé un truc et j'avais oublié de mettre le code en commentaire.

    Donc voila je suis content que ca marche !!

    Merci a tous et surtout a Mayti4 pour son aide.

    ++ bogsy

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

Discussions similaires

  1. Récupérer/envoyer des strings par socket
    Par theandroitor dans le forum API standards et tierces
    Réponses: 4
    Dernier message: 30/04/2014, 16h25
  2. Communication par socket TCP
    Par rhum187 dans le forum Réseau
    Réponses: 0
    Dernier message: 29/01/2013, 18h45
  3. Envoyer Objet / Structure par socket TCP
    Par crazy33 dans le forum C++
    Réponses: 5
    Dernier message: 21/11/2010, 20h49
  4. Communication par socket TCP entre module windows et linux
    Par =o0 MOH =0o= dans le forum Réseau
    Réponses: 2
    Dernier message: 29/03/2007, 17h04
  5. débutant : envoi d'un String par socket impossible
    Par 2tsiris dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 26/02/2007, 18h17

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