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 :

Connexion avec TClientSocket - blocage


Sujet :

C++Builder

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2002
    Messages
    481
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 481
    Par défaut Connexion avec TClientSocket - blocage
    Bonjour,
    j'ai écrit un petit logiciel mettant à l'heure le PC à partir d'Internet.
    Cela a fonctionné sans problème pendant des mois.
    Maintenant, de temps en temps, il y a un blocage. J'ai identifié la ligne où se
    produit le blocage, mais je n'ai pas trouvé la solution :

    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
     bool  TForm1::reception(AnsiString *recept)
    try
      {
        ClientSocket->Host=asAdresseIP;
        ClientSocket->Port=13;
        ClientSocket->Address=asAdresseIP;
        ClientSocket->Open();
        ClientSocket->Active=true;
        connected=true;
      }
      catch(...)
      {
    
      }
      
      if(!connected) return false;
      
      bool ok=false;
      int i=0;
      try
      {
    	  while(!ok && i<1000)
    	  {
    		*recept +=ClientSocket->Socket->ReceiveText();  // C'est ici que   
                                                                                      // tout s'arrête  
    
    		if(recept->Length()>0)  ok=true;
    		++i;
    	  }
      }
      catch(...)
      {
    	ShowMessage("Réception impossible");
      }
      return ok;
    }
    //---------------------------------------------------------------------------
    Le blocage n'est pas systématique,mais lorsqu'il arrive cela dure indéfiniment.
    Cela voudrait signifier que le programme ne passe pas à la ligne suivante.

    Quelqu'un a-t-il une idée sur ce sujet ?

    Merci

  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
    la méthode ReceiveText est bloquante , raison pour laquelle elle doit être employée uniquement dans le corps d'un évènement Onread.ou OnSocketEvent

    cordialement
    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

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2002
    Messages
    481
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 481
    Par défaut
    Je vous remercie pour votre réponse.
    Pouvez vous m'en dire plus, c'est à dire que devrais je ajouter
    comme code pour éviter ces blocages ?

    Merci encore

  4. #4
    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
    Bonjour,
    dans la page évenement du composant TclientSocket doubleclick sur l'évenement Onread
    une méthode sera automatiquement crée,
    ensuite il ne reste plus à introduire dans le corps de la méthode le code de réception

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    *recept +=ClientSocket->Socket->ReceiveText();
    l'aide de Borland précise
    Remarque : Les sockets non bloquants ne reçoivent pas toujours d'événement OnRead pour le dernier bit de données transmis au travers de la connexion. Lors de l'utilisation d'un socket non bloquant, vérifiez toutes les données non lues dans l'événement OnDisconnect afin de vous assurez que tout est géré.

    donc pour pallier a ce problème utilise également l'évenemment onDisconect avec le même code de reception des données
    Cordialement


    tu peux te référer à l'aide de C++ Builder
    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

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2002
    Messages
    481
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 481
    Par défaut
    J'ai utilisé une autre méthode, trouvée sur Internet.
    J'ai utilisé un TWinSocketStream.
    Cela a l'air de fonctionner.

    Merci quand même, la propriété bloquante du ClientSocket m'a incité
    à trouver une parade.

    Merci encore

  6. #6
    Membre confirmé
    Inscrit en
    Juillet 2004
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 51
    Par défaut
    Salut,

    Est-ce que tu pourrais détailler cette solution, ou tout à moins, donner un lien vers celle-ci ?

    Merci

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2002
    Messages
    481
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 481
    Par défaut
    voila :
    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
    const int CLIENTWAITTIME = 20000, BUFFERSIZE = 64;
    
    //---------------------------------------------------------------------------
    
    void TForm1::deconnexion()
    {
      if(!connected) return;
      ClientSocket->Close();
      ClientSocket->Active=false;
      connected=false;
    }
    //---------------------------------------------------------------------------
    
    void TForm1::connexion()
    {
      try
      {
    	  ClientSocket->Host=asAdresseIP;
    	  ClientSocket->Port=13;
    	  ClientSocket->Address=asAdresseIP;
    	  ClientSocket->Open();
    	  ClientSocket->Active=true;
    	  connected=true;
      }
      catch(...)
      {
    
      }
    }
    //---------------------------------------------------------------------------
    
    bool  TForm1::reception(AnsiString *recept)
    {
      bool ok = true;
      int i=0;
      char buffer[BUFFERSIZE];
      try
      {
    	  TWinSocketStream *pStream;
    	  int iRead = 0;
    	  pStream = new TWinSocketStream(ClientSocket->Socket, CLIENTWAITTIME);
    	  while(connected)
    	  {
    		if(!pStream->WaitForData(CLIENTWAITTIME))
    		{
    		  ok = false;
    		  deconnexion(); // 
    		  return false;
    		}
    		iRead = pStream->Read(buffer, sizeof(buffer));
    		if(iRead == 0)
    		{
    		  ok = false;
    		  deconnexion();
    		  return false;
    		}
    		*recept = AnsiString(buffer);
    		ok = true;
    		deconnexion();
          }
    	 
      }
      catch(...)
      {
    
      }
      return ok;
    }
    //---------------------------------------------------------------------------
    On peut certainement améliorer, mais il n'y a plus de blocage.

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

Discussions similaires

  1. Echec de connexion avec la BD
    Par manel007 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 08/02/2005, 12h01
  2. [ORACLE 10g Linux] Pbm de connexion avec un Client winXP
    Par zarbiwayne dans le forum Administration
    Réponses: 26
    Dernier message: 20/08/2004, 22h37
  3. Connexion avec Perl
    Par BARBIER dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 05/05/2004, 14h05
  4. Connexion avec interbase
    Par X Trips dans le forum Autres éditeurs
    Réponses: 5
    Dernier message: 30/03/2004, 13h15
  5. [WSAD5] Connexion avec une base Lotus
    Par mickey dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 11/03/2004, 08h37

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