Lecture grace au socket -- Erreur

cs_megamario Messages postés 145 Date d'inscription lundi 15 juin 2009 Statut Membre Dernière intervention 14 février 2013 - 12 nov. 2009 à 19:38
cs_megamario Messages postés 145 Date d'inscription lundi 15 juin 2009 Statut Membre Dernière intervention 14 février 2013 - 12 nov. 2009 à 22:22
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
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 réponses

cs_goodboy21 Messages postés 29 Date d'inscription samedi 1 décembre 2007 Statut Membre Dernière intervention 11 avril 2010
12 nov. 2009 à 21:08
salut,
utilise receivebuf à la place de receivetext, car toutes tes données sont séparées par EOT et non par \n et c'est en ce sens que receivetext te renvoie des données de taille aléatoire car il ne trouve pas le marqueur de fin de chaîne.
le soucis avec receivebuf c'est que tu devra trouver toi-même ton marqueur de fin de transmition et le transtyper le contenu en ansistring.
bon courage....
0
cs_megamario Messages postés 145 Date d'inscription lundi 15 juin 2009 Statut Membre Dernière intervention 14 février 2013
12 nov. 2009 à 22:22
J'ai essayer avec receivebuf au lycée mais j'ai pas compris comment l'utilisé car effectivement vous me dite qu'il faut le transtyper mais je vois pas exactement ce qu'il faut faire.
receivebuf attendant un (void* buff ,int)
L'int j'ai compris que c'est le nombre de caractère a récupérer. Mais le void* je vois pas comment le traité.

Technicien en électricité industriel. En cours de reconversion par un BTS IRIS 2éme année.Actuellement en stage dans mon entreprise en R&D.
0
Rejoignez-nous