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 :

Déconnecter proprement un client


Sujet :

C++Builder

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 162
    Par défaut Déconnecter proprement un client
    Bonjours,
    J'ai crée un serveur avec borland, qui permet de réceptionner des messages venant de différents clients, cependant je me trouve devant un problème / erreur lorsqu'un client se déconnecte ou lorsque que je souhaite stoppé l'écoute de mon serveur :

    - Le code fonctionne pour 1 client mais quand j'ai 2 client en simultané et que j'arrête mon serveur j'ai l'erreur suivante :

    EListeError indice hors limite (1)

    Fonction pour stopper l'écoute du serveur
    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
    void __fastcall TForm1::Arrter1Click(TObject *Sender)
    {
    TListItem * LI ;
    int nbClients = Server1->Socket->ActiveConnections-1;
    ShowMessage("Nbclients : " +IntToStr(nbClients));
     
     for(int i =0;i<=nbClients;i++) 
     {
     
            //On récup la socket a fermé en fonction du client
            //Client 1 : Connections[0]  = 408
            //Client 2 : Connections[1]  = 412
            int SocketClients = Server1->Socket->Connections[i]->SocketHandle;
            Server1->Socket->Connections[i]->SendText("quit");
            //message de test
            ShowMessage("Fermeture SocketHandle : " +IntToStr(SocketClients)+" connection[" + IntToStr(Server1->Socket->Connections[i])+"]");
     
            //effacer la ligne correspondant au client déconnecté
            LI = ListView1->FindCaption(0,IntToStr(SocketClients),false,true,false);
            LI->Delete();
           //deconnecter le client en fonction de sa socket
            Server1->Socket->Connections[i]->Disconnect(SocketClients);
     }
     
    Server1->Socket->Close();
    Server1->Active = false;
    Form2->FlagListen = false;
    StatusBar1->Panels->Items[3]->Text = "Status : innactif ";
    Fonction déconnexion du client
    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
    void __fastcall TForm1::Server1ClientDisconnect(TObject *Sender,
          TCustomWinSocket *Socket)
    {
     TListItem * LI;
     int SocketClient = Socket->SocketHandle;
     //affichage test
     ShowMessage("Fermeture SocketHandle : " +IntToStr(SocketClient));
     
    //On ferme la socket ouverte
    Socket->CleanupInstance();
    Socket->Free();
    Socket->Disconnect(SocketClient);
     //Server1->Socket->Close();
     
     //effacer la ligne du Listview correspondant au cleint déconnecté
     LI = ListView1->FindCaption(0,IntToStr(SocketClient),false,true,false);
     LI->Delete();
     
    }

  2. #2
    Membre Expert
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Billets dans le blog
    1
    Par défaut
    Hello
    il me semble que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int nbClients = Server1->Socket->ActiveConnections-1;
    est mis a jour par le composant donc quand dans ta boucle
    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
     
    for(int i =0;i<=nbClients;i++) 
     {
     
            //On récup la socket a fermé en fonction du client
            //Client 1 : Connections[0]  = 408
            //Client 2 : Connections[1]  = 412
            int SocketClients = Server1->Socket->Connections[i]->SocketHandle;
            Server1->Socket->Connections[i]->SendText("quit");
            //message de test
            ShowMessage("Fermeture SocketHandle : " +IntToStr(SocketClients)+" connection[" + IntToStr(Server1->Socket->Connections[i])+"]");
     
            //effacer la ligne correspondant au client déconnecté
            LI = ListView1->FindCaption(0,IntToStr(SocketClients),false,true,false);
            LI->Delete();
           //deconnecter le client en fonction de sa socket
            Server1->Socket->Connections[i]->Disconnect(SocketClients);
     }
    lors de la disconnection du socket la propriété ActiveConnections a été décrémentée de 1 --> Erreur lors de la boucle
    j'utiliserais plutôt une boucle du type while
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    while (ServerSocket1->Socket->ActiveConnections>0) {
    TCustomWinSocket*  SocketClient = ServerSocket1->Socket->Connections[0];
    ServerSocket1->Socket->Connections[0]->Close();
    try
     {
      delete SocketClient;  //ne pas oublier la destruction du socket 
     }
     catch(Exception &E)
     {
     }
    cdlt
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

Discussions similaires

  1. [XL-2000] "l'objet invoqué s'est déconnecté de ses clients"
    Par Noe06 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 18/07/2012, 09h54
  2. [XL-2010] L'objet invoqué s'est déconnecté de ses clients
    Par kesimon63 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 13/06/2012, 14h44
  3. Erreur Automation:l'Objet invoqué s'est déconnecté de ses clients
    Par alfadz dans le forum VB 6 et antérieur
    Réponses: 16
    Dernier message: 09/12/2011, 16h17
  4. L'objet invoqué s'est déconnecté de ses clients.
    Par Sigmax dans le forum IGN API Géoportail
    Réponses: 0
    Dernier message: 29/06/2011, 15h50
  5. [XL-2002] erreur automation. L'objet évoqué s'est déconnecté de ses clients
    Par marcelisa2 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 18/01/2011, 10h04

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