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 :

[Builder C++] Infos dans une trame


Sujet :

C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 46
    Par défaut [Builder C++] Infos dans une trame
    Voilà pour ceux qui m'ont deja filé un coup de main, c'est un deuxieme soucis que je rencontre.

    Dans mon projet je communique avec un serveur pour l'identification d'un utilisateur autorisé a faire fonctionner mon application. Pour cela je lui envoie la trame suivante:
    [LOGIN]NomDeLogin;MotDePasse;PartieOpérative[/LOGIN]
    La réponse du serveur a ma tentive de connexion est:
    -Pour une authentification réussie
    [LOGIN]OK;[/LOGIN]
    -Pour une authentification erronée
    [LOGIN]NO;Message[/LOGIN]
    Dans le cas d'une authentification erronée j'aimerai pouvoir récupérer le message renvoyé par le serveur pour le traiter. J'ai deja une pré-analyse de faite. Je teste la réponse du serveur si elle vaut OK je donne l'accés au programme. Si elle vaut NO j'aimerai pouvoir afficher l'erreur dans un ShowMessage et permettre une nouvelle tentative de connexion.

    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
    void __fastcall TForm1::ClientRead(TObject *Sender,
          TCustomWinSocket *Socket)
    {
     AnsiString msgErr;
     if (Socket->ReceiveText()== "[LOGIN]OK;[/LOGIN]"){
      ShowMessage("Vous etes connecté au Controle d'Acces de SimCity");
      Form3->ApLog->Lines->Add("Connexion au controle d'accés réussie");
      Form2->ShowModal();
      Close();
     }
     else {
      msgErr = Socket->ReceiveText();
      Form3->ApLog->Lines->Add("Connexion échouée:" + msgErr);
     }
    }
    J'utilise actuellement la totalité de ma trame pour indiquer la nature de mon erreur mais je prefererai récupérer unique la partie Message de la trame retour.
    Je ne vois pas comment procéder pour "enlever" le début et la fin de la trame. Si vous pouvez m'eclairer ça serait sympa. Merci

  2. #2
    Membre éclairé Avatar de jehrikhan
    Inscrit en
    Mars 2008
    Messages
    90
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 90
    Par défaut
    peut etre en utilisant la méthode AnsiString::SubString

    Ca permet de récupérer une sous chaine simplement a partir du moment ou sa position dans la chaine de départ est fixe

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 46
    Par défaut
    Si la position de la sous-chaine dépend de son premier caractère alors oui elle ne change jamais étant donné que le début de la trame est toujours identique:

    Je vais creuser cette idée. Je connaissais pas les SubString.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 46
    Par défaut
    J'ai regardé un peu les substring c'est un outil interressant du moment que la sous-chaine de caractères et toujours de la meme longueur.

    Description:
    Renvoie une sous-chaîne spécifiée de l'AnsiString.

    AnsiString __fastcall SubString(int index, int count) const;

    Renvoie une nouvelle AnsiString qui est une sous-chaîne de l'AnsiString transmise. Cette sous-chaîne contiendra count caractères à partir de l'indice index.
    Dans mon cas je ne sais jamais ce que va répondre le serveur dans le cas d'un erreur de connexion. C'est pour ça que je veux récupérer la chaine de caractère qu'il me transmet qui peut etre de taille variable. Je vais essayer de me renseigner au prés de mon collègue histoire de savoir s'il a défini des nouvelles propriétés aux réponses du serveur.

  5. #5
    Membre éclairé Avatar de jehrikhan
    Inscrit en
    Mars 2008
    Messages
    90
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 90
    Par défaut
    pour déterminer la fin de ton message venant du serveur tu pourait peut etre utiliser AnsiPos

    Renvoie l'indice de début de la sous-chaîne spécifiée.

    int __fastcall AnsiPos(const AnsiString& subStr) const;

    Description

    Renvoie l'indice de début de la sous-chaîne subStr dans l'AnsiString, où 1 est le premier caractère de la chaîne, 2 le deuxième caractère, etc. Si la sous-chaîne n'est pas contenue dans l'AnsiString, AnsiPos renvoie 0. Cette fonction membre est identique à Pos mais supporte les chaînes de caractères multi-octets.
    Vu que ta trame se termine forcément par [/LOGIN], tu trouves la position de cette sous chaine. tu enleves 1 et tu as la fin de ta sous chaine message.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 46
    Par défaut
    Bon alors j'ai pris contact avec mon collègue qui m'a confirmé que la taille des messages était bien variable. J'ai donc commencé une analyse. J'en arrive au résultat suivant:

    -Sauvegarde de la trame reçu dans un AnsiString.
    -Recherche de l'élément [/LOGIN] dans la trame reçu.
    -Retour de la position -1 de l'élément [/LOGIN].
    -Copie du message entre la position 11 qui correspond au premier caractère du message dans la trame reçue( => [LOGIN]No;Message[/LOGIN] ) et le dernier caractère du message qui correspond à la position -1 de l'élément [/LOGIN].

    Mon analyse est elle bonne? Suggérez vous une autre solution?

    Bien entendu je vais devoir utiliser pos et SubString.

  7. #7
    Membre éclairé Avatar de jehrikhan
    Inscrit en
    Mars 2008
    Messages
    90
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 90
    Par défaut
    Perso je serais allé sur uen idée comme ça.
    Apres il y a peut être, voir surement, d'autres façon de le faire mais je pense que ça devrait marcher

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 46
    Par défaut
    Ok merci. Bah je laisse le topic ouvert tant que j'ai pas une solution qui compile et qui fonctionne ^^ ça évitera de faire un autre TOPIC si je n'arrive pas a programmer cette solution.

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 46
    Par défaut
    Bon alors mon code a bien avancé c'est la bonne nouvelle...

    La mauvaise je n'arrive pas a utiliser Length et SubString.

    Voilà mon code bout de code source. J'ai peut etre oublier de déclarer un .h mais je ne sais pas lequel. Mais je pense que j'ai plus un probleme d'utilisation je connais pas ces fonctions donc forcement ça peut pas marché du premier coup

    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
    23
    24
    25
    26
    27
    28
    29
    30
    void __fastcall TForm1::ClientRead(TObject *Sender,
          TCustomWinSocket *Socket)
    {
     AnsiString repServ, /* Reponse serveur */
                msgErr, /* Contenu du message cas d'erreur de connexion */
                finTrame; /* [/LOGIN] */
     int positionFinTrame, /* Position de [/LOGIN] dans repServ cas d'erreur */
         nbCarTrame, /* nombre de caracteres dans la trame */
         nbCarMsgTrame; /* nombre de caracteres dans le message d'erreur de la trame */
     
     repServ = Socket->ReceiveText(); /* Enregistrement de la reponse serveur */
     if (repServ == "[LOGIN]OK;[/LOGIN]"){ /* Reponse serveur OK */
      ShowMessage("Vous etes connecté au Controle d'Acces de SimCity");
      Form3->ApLog->Lines->Add("Identification au controle d'accés réussie");
      Form2->ShowModal();
      Close();
     }
     else { /* Reponse serveur NO */
      finTrame = "[/LOGIN]";
      positionFinTrame = repServ.Pos(finTrame);
      if(positionFinTrame == 0){ /* Trame erronee */
       ShowMessage("Erreur de communication avec le Controle d'Acces (CA).");
      }
      else {
       nbCarTrame = repServ->Length; /* Recuperer taille de la chaine de carectere */
       nbCarMsgTrame = nbCarTrame - 11 - positionFinTrame - 1; /* Calcul de longueur du message */
       msgErr = SubString(11,nbCarMsgTrame); /* Recuperer le message d'erreur transmis par la trame */
      }
     }
    }

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 46
    Par défaut
    J'ai modifié mon source...

    les quelques lignes de la fin celle où j'utilise Length et Substring.
    Je ne suis pas sur que ce soit juste au niveau synthaxe aucun soucis ça compile mais je n'ai pas les moyens de tester actuellement (faut que je fasse une petite appli serveur ça se fera demain sans doute...)

    bon voilà le morceau de code.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     else {
       nbCarTrame = repServ.Length(); /* Recuperer taille de la chaine de carectere */
       nbCarMsgTrame = nbCarTrame - 11 - positionFinTrame - 1; /* Calcul de longueur du message */
       msgErr = repServ.SubString(11,nbCarMsgTrame); /* Recuperer le message d'erreur transmis par la trame */

  11. #11
    Membre éclairé Avatar de jehrikhan
    Inscrit en
    Mars 2008
    Messages
    90
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 90
    Par défaut
    ton erreur est à ce niveau la
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nbCarMsgTrame = nbCarTrame - 11 - positionFinTrame - 1;
    le plus simple est de prendre un exemple.

    Si on prend la trame [LOGIN]NO;message[/LOGIN]

    ton nbCarMsgTrame vaut celon ton calcul 25 - 11 - 18 - 1 = -5

    T'admetras qu'une longueur de trame négative c'est pas ce qu'il nous faut :p

    ton calcul devrait resembler a quelque chose comme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     nbCarMsgTrame = nbCarTrame - 11 - (nbCarTrame -positionFinTrame);
    ce qui nous fait pour le meme exemple : 25 - 11 -(25-18) = 7

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 46
    Par défaut
    Effectivement! Merci pour ta correction je me serais certainement pris le chou pour savoir d'où sortait une erreur comme celle là ^^

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

Discussions similaires

  1. Récupérer des info dans une page html
    Par DORBRITZ dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 06/03/2008, 11h13
  2. Récupération d'une info dans une balise
    Par sirbaldur dans le forum Langage
    Réponses: 4
    Dernier message: 18/07/2006, 11h34
  3. Passage d'infos dans une autre frame
    Par dumser1 dans le forum Agents de placement/Fenêtres
    Réponses: 2
    Dernier message: 23/11/2005, 09h28
  4. Réponses: 14
    Dernier message: 17/11/2005, 14h36
  5. [MySQL] Chercher des info dans une DB, et les afficher en lien
    Par pierrot10 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 12/10/2005, 19h29

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