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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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.

+ 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