Lecture grace au socket -- Erreur

Signaler
Messages postés
146
Date d'inscription
lundi 15 juin 2009
Statut
Membre
Dernière intervention
14 février 2013
-
Messages postés
146
Date d'inscription
lundi 15 juin 2009
Statut
Membre
Dernière intervention
14 février 2013
-
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

Messages postés
29
Date d'inscription
samedi 1 décembre 2007
Statut
Membre
Dernière intervention
11 avril 2010

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....
Messages postés
146
Date d'inscription
lundi 15 juin 2009
Statut
Membre
Dernière intervention
14 février 2013

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.