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++Builder Discussion :

Utilisation des Socket pour un mini chat


Sujet :

C++Builder

  1. #1
    Membre averti Avatar de megamario
    Homme Profil pro
    VB6/VB.net/C/C++/C#
    Inscrit en
    Septembre 2008
    Messages
    929
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : VB6/VB.net/C/C++/C#
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2008
    Messages : 929
    Points : 312
    Points
    312
    Par défaut Utilisation des Socket pour un mini chat
    Bonjour j'ai un petit problème avec une appli que l'on doit fait au lycée, un mini chat.

    Le voudrais que lorsque l'on appuis sur un bouton connexion cela se connecte au serveur, que cela demande si le login est libre, et demande la liste des login connecter.

    Voila ce que j'ai fait:
    Je suis sous C++Builder6
    Code C/C++ :
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
     
    void __fastcall TForm1::ButtonConnexionClick(TObject *Sender)
    {
     
            AnsiString Envoi;
            AnsiString LaLigne ="";
            Connexion();
     
            Sleep(100);
            do
            {
            LaLigne = ClientSocket1 ->Socket ->ReceiveText();
            }while((!SauvegardeLigne(LaLigne)) && LaLigne == NULL);
            if (TraitementLigne())
            {
                    ClientSocket1 ->Socket ->SendText(Envoi.sprintf("%d%s%d",'L',EditLogin ->Text,'\x04' ) );
                    Sleep(100);
                    do
                    {
                            LaLigne = ClientSocket1 ->Socket ->ReceiveText();
                    }while((!SauvegardeLigne(LaLigne)) && LaLigne =="");
                    if (TraitementLigne())
                    {
                            ClientSocket1 ->Socket ->SendText(Envoi.sprintf("%d%d",'*','\x04') );
                            Sleep(100);
                            do
                            {
                                    LaLigne = ClientSocket1 ->Socket ->ReceiveText();
                            }while((!SauvegardeLigne(LaLigne)) && LaLigne =="");
                            if (TraitementLigne())
                            {
                                    //
                            }
                            else
                            {
                                    ListBoxMessage ->Items -> Add("Erreur de reception des login");
                                    Deconnexion();
                            }
                    }
            }
            else
            {
                    ListBoxMessage ->Items -> Add("Reception imcomplette");
                    Deconnexion();
            }
    }
    void TForm1::Deconnexion()
    {
            ButtonConnexion->Enabled = true;
            EditIP->Enabled  = true;
            EditPort->Enabled = true;
            EditLogin->Enabled = true;
            ButtonDeconnexion->Enabled = false;
            ClientSocket1 ->Active = true;
    }
    void TForm1::Connexion()
    {
            ButtonConnexion->Enabled = false;
            EditIP->Enabled  = false;
            EditPort->Enabled = false;
            EditLogin->Enabled = false;
            ButtonDeconnexion->Enabled = true;
            ClientSocket1 ->Address = EditIP ->Text ;
            ClientSocket1 ->Port = EditPort ->Text.ToInt() ;
            ClientSocket1 ->Active = true;
    }
    bool TForm1::SauvegardeLigne(AnsiString LaLigne)
    {
            int Nb = LaLigne.Length() ;
            if (LaLigne.SubString(Nb-1,1)== '\x04')
            {
                    Ligne += LaLigne;
                    return true;
            }
            else
                    Ligne += LaLigne;
                    return false;
    }
     
    bool TForm1::TraitementLigne()
    {
            int Nb = Ligne.Length();
            AnsiString Car = Ligne.SubString(1,1);
            if (Car == 'C')
            {
                    ListBoxMessage ->Items-> Add("Connecter");
                    return true;
            }
            if (Car == '0')
            {
                    ListBoxMessage ->Items->Add("Login accepté");
                    return true;
            }
            if (Car == '1')
            {
                    ListBoxMessage->Items -> Add("Login deja existant, veuillez en changer");
                    ListBoxMessage->Items -> Add("Deconnexion");
                    Deconnexion();
                    return false;
            }
    }


    Mon problème c'est qu'a la ligne :
    LaLigne = ClientSocket1 ->Socket ->ReceiveText();
    Je reçois rien du tout,

    J''ai peut être encore des prob de gestion des booléens, mais c'est pas le problème.
    Le serveur me connecte bien et lors de la connexion accepter il me revoie la ligne
    'C''\x04' Le caractère C plus EOT.

    Au lycée j'ai réussi cela marche mais en utilisant l'évènement de réception. Mais a moins de gérer le tout avec des sémaphore il me faut un bouton pour se connecter un autre pour se loger et un autre pour la liste des connecter. je voulais éviter sa pour la connexion. Puis après utilisé l'évènement, la j'aurais pas le choix pour la réception des messages.

    Merci de votre aide pour comprendre mon erreur

    Technicien en électricité industriel (39 ans). En cours de reconversion par un BTS IRIS 2éme année.Actuellement en cours.

  2. #2
    Membre chevronné
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Points : 2 189
    Points
    2 189
    Par défaut
    Salut, j'ai pas vraiment de réponse pour toi, par contre je voulais te donner quelques conseils pour ton code.

    Dans la fonction suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    bool TForm1::SauvegardeLigne(AnsiString LaLigne)
    {
            int Nb = LaLigne.Length() ;
            if (LaLigne.SubString(Nb-1,1)== '\x04')
            {
                    Ligne += LaLigne;
                    return true;
            }
            else
                    Ligne += LaLigne;
                    return false;
    }
    Je te conseil de ne pas répéter la même instruction dans les deux cas (Ligne += LaLigne). En plus si LaLigne.Length() est utilisé qu'une seul fois, pas besoin d'utiliser de variable. Donc le code deviens:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    bool TForm1::SauvegardeLigne(AnsiString LaLigne)
    {
            Ligne += LaLigne;
            if (LaLigne.SubString(LaLigne.Length()-1,1) == '\x04')
                    return true;
            else
                    return false;
    }
    Dans ta fonction TraitementLigne(), la variable Nb n'est pas utilisé, donc tu peux l'enlever. Au lieu d'utiliser plusieurs if consécutifs, il vaut mieux utiliser des if else ou un switch pour que dès qu'il trouve une correspondance, il cesse d'essayer. Je sais que tu avais des return à l'intérieur, mais c'est un bonne pratique. Pour avoir accès à un caractère, tu peux utiliser les []. En faisant Ligne[1] on a accès au premier caractère de la chaine. Donc, le code devient:
    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
    bool TForm1::TraitementLigne()
    {
            bool ValDeRetour = false;
            switch(Ligne[1])
            {
                case 'C':
                    ListBoxMessage ->Items-> Add("Connecter");
                    ValDeRetour = true;
                    break;
                case '0':
                    ListBoxMessage ->Items->Add("Login accepté");
                    ValDeRetour = true;
                    break;
                case '1':
                    ListBoxMessage->Items -> Add("Login déjà existant, veuillez en changer");
                    ListBoxMessage->Items -> Add("Deconnexion");
                    Deconnexion();
                    break;
            }
            return ValDeRetour;
    }
    Bonne chance pour ton projet.
    • Plus un ordinateur possède de RAM, plus vite il peut générer un message d'erreur. - Dave Barry
    • Je n'ai pas peur des ordinateurs. J'ai peur qu'ils viennent à nous manquer. - Isaac Asimov
    • Le code source est comme une belle femme, plus on le regarde, plus on trouve des défauts. - Crayon

  3. #3
    Membre averti Avatar de megamario
    Homme Profil pro
    VB6/VB.net/C/C++/C#
    Inscrit en
    Septembre 2008
    Messages
    929
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : VB6/VB.net/C/C++/C#
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2008
    Messages : 929
    Points : 312
    Points
    312
    Par défaut
    Bonjour,

    merci pour les petites info, mais il est vrai que je commence tout juste a me familiarisé avec certaine conception. En ce qui concerne les variable en trop il va de soit que je les vires mais j'étaie en plein débogage et il y a encore ds truc qui traine. Pour les [] pour sélectionner un caractère dans un AnsiString mon prof me l'a rappeler aussi et c'est vrais que c'est tout bête mais je ni est pas pensé vu qu'il venais tout juste de nous montrer la fonction SubString j'ai foncé dedans

    En ce qui concerne mon problème, j'en ai plus car j'ai trouvé.
    Mon prof m'avais dit d'utilisé Application-> processMessage(); et de continuer a utilisé les évènements.
    Mais cela plantait chez moi, mais j'ai trouvé, enfin plutôt j'ai réussi a le faire marcher sans savoir pourquoi. Après pas mal de recherche j'ai vu que Builder n'était pas exempt de défaut relativement case pied surtout en cas d'intégration de programme réalisé sur une autre machine.
    Il est capricieux. Donc vu que mon projet avais été commencé au lycée j'ai tout refait de A a Z, mise a part un copier coller de ce qui se trouve dans chaque méthode et la sa marche nickel. Si je regarde les 2 codes il sont donc parfaitement identique mais l'un marche et pas l'autre!!! Merci builder.

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

Discussions similaires

  1. Utilisation des threads pour les sockets
    Par Leaffy dans le forum Tcl/Tk
    Réponses: 7
    Dernier message: 23/08/2012, 09h52
  2. Utilisation des références pour les tableaux
    Par Bouboubou dans le forum Tableaux - Graphiques - Images - Flottants
    Réponses: 4
    Dernier message: 14/12/2005, 13h47
  3. [MFC] Faible utilisation des sockets via les MFC ?
    Par Yellowmat dans le forum MFC
    Réponses: 1
    Dernier message: 25/08/2005, 17h15
  4. utilisation des sockets sous windows
    Par Tupac dans le forum Réseau
    Réponses: 2
    Dernier message: 21/12/2002, 18h24

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