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 socket asynchrone


Sujet :

C++Builder

  1. #1
    Membre régulier Avatar de jagboys
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 166
    Points : 111
    Points
    111
    Par défaut connexion socket asynchrone
    Bonjour,

    Dans mon programme j'utlise un TClientSocket pour me connecter à un serveur. Lorsque j'établit une connexion en mode asynchrone, la première fois le message ne passe pas. La deuxième fois je peux envoyer le message sans problème. La troisième fois, ça ne passe pas et la 4ieme fois ç'est bon. Ainsi de suite !

    J'ai cherché à comprendre ce qui se passe.

    Voici mon code :

    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
    bool __fastcall TVFM::ConnectToServer(AnsiString ServerIp, int ServerPort)
    {
           CliSock->ClientType = ctNonBlocking;
           CliSock->Host = Server;
           CliSock->Port = ServerPort;
     
           try
           {
                    CliSock->Active = true;
                    return CliSock->Active;
           }
           catch(...)
           {
     
                    UpdateHistoryList("Ne peut pas établir une connexion sur l'hôte spécifié", true);
                    return false;
           }
    }
    J'ai remarqué que CliSock->Active passe à true après un certain moment et pendant ce court lap de temps le programme tourne

    Est ce que quelqu'un à déjà aperçu ce souci ?
    Quelqu'un aurait une idée ?

    Merci d'avance.

  2. #2
    Invité
    Invité(e)
    Par défaut socket
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    try
           {
                    CliSock->Active = true;
                    return CliSock->Active;
           }
    le problème est surement relié au fait que la connexion n'est pas instantanée.
    la ligne Return Clisock->Active, est exécutée avant même que la connexion soit établit avec le système hôte.

    Si tu étais en mode blocking, tu n'aurais pas le problème car la ligne return ne serait pas exécuté tant que la connexion n'est pas réussit ou échouée.

    tu pourrais expérimenter avec ceci..

    cette boucle (non optimisée), établit la connexion, valide à chaque secondes si le statut de la connexion est actif.

    Si la connexion s'active avant le délai de 5 secondes, la boucle va quitter.

    Évidemment le délai est variable, ce n'est qu'un exemple.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    try
           {
                    CliSock->Active = true;
                    for (int k=0; k < 5; k++)  //compte jusqu'a 5
                    {
                          Sleep(1000);   //attend 1 sec
                          if (CliSock->Active == true)  //si socket actif sort
                              break;
                    } 
                    return CliSock->Active; //retourne statut
           }

  3. #3
    Membre régulier Avatar de jagboys
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 166
    Points : 111
    Points
    111
    Par défaut TClientSocket
    Bonjour Luc,

    Merci beaucoup pour ton idée.
    J'étais obligé d'utiliser un socket asynchrone afin de lire le message de retour du serveur. Pour ceci j'ai surchargé la méthode ClientSocket Read.

    Maintenant j'utilise le mode synchrone (Blocking), et j'ai trouvé la méthode pour lire le socket, car ClientSocket Read ne marche pas dans cette la mode synchrone.

    Voici une aide de builder :
    Ecrivez un gestionnaire d'événement OnRead pour lire au travers de la connexion de socket. Si le socket est un socket bloquant, utilisez un objet TWinSocketStream pour lire depuis la connexion. Sinon, utilisez les méthodes du paramètre Socket pour effectuer la lecture.

    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é.
    Par conséquent, le temps de connexion ne pose plus de problème.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
                    CliSock->Socket->SendText(t);
                    Sleep(WaitForAckTimeout);
                    AckMessage = CliSock->Socket->ReceiveText();

    Merci et à bientôt.

  4. #4
    Invité
    Invité(e)
    Par défaut Re: TClientSocket
    Citation Envoyé par jagboys
    Bonjour Luc,

    Merci beaucoup pour ton idée.
    J'étais obligé d'utiliser un socket asynchrone afin de lire le message de retour du serveur. Pour ceci j'ai surchargé la méthode ClientSocket Read.

    Maintenant j'utilise le mode synchrone (Blocking), et j'ai trouvé la méthode pour lire le socket, car ClientSocket Read ne marche pas dans cette la mode synchrone.
    le socket blocking est plus facile, mais il gèle ton application en attente d'information sur le port TCP, si cela te convient, c'est parfait. Mais ça aurait fonctionné en mode asynchrone aussi (quoi que plus complexe).

    A+

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

Discussions similaires

  1. Erreur connexion socket
    Par tilte dans le forum Requêtes
    Réponses: 1
    Dernier message: 02/04/2006, 23h48
  2. [LIVEBOX] Prbleme connexion socket
    Par sorry60 dans le forum Développement
    Réponses: 3
    Dernier message: 18/12/2005, 16h23
  3. [C++] Probleme de connexion socket client à mon serveur smtp
    Par matthieu5978 dans le forum Développement
    Réponses: 2
    Dernier message: 04/12/2005, 08h19
  4. Ouvrir une connexion socket
    Par toure32 dans le forum Langage
    Réponses: 2
    Dernier message: 12/09/2005, 21h22
  5. connexion socket borland
    Par karl2mil1 dans le forum C++Builder
    Réponses: 5
    Dernier message: 26/07/2005, 08h11

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