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 :

Ne pas afficher "Erreur socket asynchrone 10061" [Débutant]


Sujet :

C++Builder

  1. #1
    Membre régulier
    Inscrit en
    Mars 2010
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Mars 2010
    Messages : 74
    Points : 81
    Points
    81
    Par défaut Ne pas afficher "Erreur socket asynchrone 10061"
    Bonjour,

    J'utilise C++ Builder 3.
    J'ai une application Client qui contient un socketClient.
    A son activation (socketClient->Active = true), si le serveur n'est pas activé il y a une exception qui est levée : ESocketError : 'Erreur socket asynchrone 10061'.
    En version finale seule une fenetre 'Erreur socket asynchrone 10061' s'affiche, sans terminer le programme.
    Je ne souhaite pas que cette fenetre s'affiche.
    Je préfererais afficher un texte dans un Tmemo : "Avez vous pensé à activer le serveur ?"
    J'ai donc fait ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    try
    {
       clientSocket->Active = true;
    }
    catch(...)
    {
       memoInfos->Lines->Add("Avez vous pensé à activer le serveur ?");
    }
    Le souci c'est que la fenetre d'erreur continue à s'afficher sans que mon message s'ajoute dans le TMemo.

    Pourquoi ? Et comment y remédier ?

    D'avance merci !

  2. #2
    Membre chevronné
    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
    Points : 2 187
    Points
    2 187
    Billets dans le blog
    1
    Par défaut
    Salut
    Dans le gestionnaire OnError du composant TClientSocket
    met le paramètre ErrorCode à 0;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    void __fastcall TForm1::ClientSocket1Error(TObject *Sender,
          TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode)
    {
       ErrorCode=0;
    }
    cdlt

  3. #3
    Membre chevronné Avatar de nirgal76
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2007
    Messages
    906
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 906
    Points : 2 134
    Points
    2 134
    Par défaut
    Mettre à 0 ErrorCode risque d'empêcher la levée de l'exception et donc son ecriture dans le Memo.
    Pour empêcher cela, il faut déplacer l'écriture du message d'erreur Memo dans le gestionnaire OnError et mettre effectivement ErrorCode = 0.

    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
     
    void __fastcall TForm1::clientSocketError(TObject *Sender,
          TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode)
    {
      switch(ErrorCode)
      {
      // Erreur socket asynchrone
      case 10061:
        memoInfos->Lines->Add("Avez-vous pensé à activer le serveur ?");
        ErrorCode=0;
      break;
      // Autres erreurs  
      case ...
      ...
      }
    }
    Ne pas oublier de tester ErrorCode car selon l'erreur, il peut être mieux de lever une exception / afficher une erreur plus spécifique afin de faciliter la résolution de l'erreur.
    Et perso, je préfère catcher les exceptions spécifiques (ESocketError ici) plutôt que faire des catch (...). Et si je veux tout catcher d'un coup, je fais un catch (Exception& e) qui me donne plus de détail et me permet de mieux gérer l'exception.

  4. #4
    Membre chevronné
    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
    Points : 2 187
    Points
    2 187
    Billets dans le blog
    1
    Par défaut
    Bonsoir,
    une petite précision:

    le gestionnaire d'erreur OnError du composant TClientSocket est utilisé uniquement dans le cas du mode de traitement Asynchrone de ce composant
    dans ce cas il est parfaitement initile d'employer un bloc try catch
    une méthode simple de gestion d'erreur pourrait être ceci
    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
     
     
    void __fastcall TForm1::ClientSocket1Error(TObject *Sender,
          TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode)
    {
    switch(ErrorEvent)
      {
        case(eeConnect):
           Application->MessageBox("Impossible de contacter le serveur","Client",MB_OK);
           break;
     
        case eeGeneral:
        case eeSend:
        case eeReceive:
        case eeDisconnect:
        case eeAccept:
        default:
          Application->MessageBox("Erreur socket","Client",MB_OK);
     
      }
     
      ErrorCode = 0;
    }
     
    //pour ouvrir le socket simplement
    ClientSocket1->Open();
    dans le cas du mode de traitement synchrone
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    //pour ouvrir le socket
     
    try
     {
    	 ClientSocket1->Open();
     }
     catch(ESocketError &E)
     {
    	 ShowMessage(E.Message);
     }
     
    // le message affiché sera le suivant
    //"Erreur socket Windows : Une opération a été tentée sur un réseau impossible à atteindre (10051), avec l'API 'connect'"
    cdlt

  5. #5
    Membre régulier
    Inscrit en
    Mars 2010
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Mars 2010
    Messages : 74
    Points : 81
    Points
    81
    Par défaut
    Bonsoir,

    Grace à vous j'en ai appris beaucoup plus que ce que j'espérais.
    Un immense merci à vous deux pour toutes vos précisions !

    Passez de bonnes fêtes. =)

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

Discussions similaires

  1. QGIS : lenteur pour afficher les listes des vues dans "Ajouter une table PostGIS"
    Par fafa63 dans le forum SIG : Système d'information Géographique
    Réponses: 2
    Dernier message: 11/07/2014, 19h04
  2. [Oracle] Ne pas afficher les erreurs Oracle
    Par naunau31 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 28/06/2013, 19h15
  3. Erreur socket asynchrone 10053
    Par juju1988 dans le forum Langage
    Réponses: 2
    Dernier message: 01/03/2012, 10h09
  4. Erreur socket asynchrone
    Par Hellgast dans le forum C++Builder
    Réponses: 2
    Dernier message: 21/11/2009, 11h29
  5. Erreur Socket Asynchrone 10053
    Par QAYS dans le forum Delphi
    Réponses: 2
    Dernier message: 16/06/2006, 07h44

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