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 :

TIdFTP et blocage en cas de non réponse du serveur


Sujet :

C++Builder

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de benj63
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mai 2002
    Messages
    207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 207
    Par défaut TIdFTP et blocage en cas de non réponse du serveur
    Bonjour,

    J'utilise dans différents programmes le composant Indy TIdFTP, afin de gérer mes accès et transferts FTP.

    Je me suis rendu compte récemment que lorsqu'on fait une connexion au serveur FTP, puis éventuellement différents requêtes, il arrive que le serveur FTP ne réponde plus. Et dans ce cas là, le composant TIdFtp ne renvoie pas une erreur, il reste en attente d'une réponse du serveur FTP, et mon programme reste figé.

    Exemple de prog d'accès FTP :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    TIdFTP *idftp = new TIdFTP(NULL);
    idftp->Passive = true;
    idftp->Host     = hote;
    idftp->Port     = port;
    idftp->User     = login;
    idftp->Password = password;
     
    idftp->Connect();
     
    ...
     
    idftp->Disconnect();
    delete idftp;
    J'ai tenté un try{ idftp->Connect();} catch(...) pour détecter un éventuel événement "erreur" ou "délai de reponse trop long" mais le composant ne gère pas cela...

    Auriez-vous des solutions pour faire en sorte qu'une absence de réponse du serveur FTP ne bloque pas mon appli ? Sachant que j'aimerais bien conserver le composant Indy FTP et tout ce que j'ai déjà fait autour...

    Je pensais à appeler la partie connexion FTP / transfert / déconnexion via un thread et tuer automatiquement le thread s'il ne répond pas au bout d'un certain temps, mais je ne parviens pas à tuer correctement le thread ( le thread attend que la connexion FTP soit fermée et comme le serveur FTP ne répond plus, ça n'arrive jamais et mon prog reste bloqué)...

    Voilà ce que j'avais fait avec les threads :
    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
    //---------------------------------------------------------------------------
    class TMonThreadFTP : public TThread
    {
    private:
    protected:
           void __fastcall Execute();
    public:
            __fastcall TMonThreadFTP(bool CreateSuspended);
            Ftp *ftp;
    };
    //---------------------------------------------------------------------------
    __fastcall TMonThreadFTP::TMonThreadFTP(bool CreateSuspended)
            : TThread(CreateSuspended)
    {
    }
     
    //---------------------------------------------------------------------------
    void __fastcall TMonThreadFTP::Execute()
    {
    TIdFTP *idftp = new TIdFTP(NULL);
    idftp->Passive = true;
    idftp->Host     = hote;
    idftp->Port     = port;
    idftp->User     = login;
    idftp->Password = password;
     
    while(!this->Terminated)
    {
            idftp ->Connect();
     
            Suspend();
    }
    delete idftp;
    }
     
    //---------------------------------------------------------------------------
    void __fastcall TForm1::ButtonDemarrerConnexionFtpClick(TObject *Sender)
    {
    MonThreadFTP = new TMonThread(false);
    MonThreadFTP->FreeOnTerminate = true;
    }
    //---------------------------------------------------------------------------
     
    void __fastcall TForm1::ButtonTuerConnexionFtpClick(TObject *Sender)
    {
    delete MonThreadFTP;
    }
    //---------------------------------------------------------------------------
    Merci par avance pour votre aide et vos idées !

  2. #2
    Expert confirmé

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Par défaut
    Salut,
    il me semble que tes méthode Connect et Disconnect, comme d'autre du composant TIdFTP prenne en option un argument qui est le timeout de la requête, par contre c'était peut-être pas la même version des composant vu que je travaillé sous BCB 2006 mais cherche de se côté la

  3. #3
    Membre éclairé Avatar de benj63
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mai 2002
    Messages
    207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 207
    Par défaut
    Malheureusement, le composant Indy TIdFTP fourni avec BCB6 ne dispose pas de cet élément (ça a sûrement dû être corrigé suite au problème que je mentionne !!) :

    TIdFTP.Connect

    Opens a connection to the FTP server.

    procedure Connect(AutoLogin: Boolean);

    Parameters

    AutoLogin: Boolean = true

    Login the user when connected. Default value is True.


    Description

    Connect is a procedure that opens the connection to an FTP server identified in the Host property. Connect relies on the inherited Connect method to open the socket handle. Connect can raise an Exception when the server connection cannot be established.
    When AutoLogin is True, the Connect method will send the authentication information in the User and Password properties to the FTP server. This action also triggers the FTP SYST command to identify the host FTP server, and stores the return value in SystemDesc.
    Penses-tu que je puisse télécharger et utiliser le composant version 2006 ?...

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    573
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 573
    Par défaut
    Salut

    TIdTime.Timeout
    Indy read delay in milliseconds.
    property Timeout: Integer;
    Description
    Timeout is an Integer property that represents the number of milliseconds Indy read operations must wait for a readable connection. For TIdTime, the default value of TimeOut is 2500 (2.5 seconds).

    TIdTime
    TIdTime = class(TIdTCPClient)
    Description
    TIdTime is a client implementation of the Time Protocol as described in the Internet Standards document:
    Time Protocol, (RFC 868)
    Time is a simple protocol for synchronizing time on a local network. For a time protocol with higher accuracy over several networks, use TIdSNTP. To retrieve the current date and time in human-readable form, use TIdDayTime.
    Please note that the Time Protocol in its current form can handle most dates after the year 2035. This limitation is stated in RFC 868.


    Et eventuellement voir avec ton mode de connection : passif ou pas

  5. #5
    Membre éclairé Avatar de benj63
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mai 2002
    Messages
    207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 207
    Par défaut
    J'ai tenté avec idtime, et en désactivant le mode passif, cela ne change absolument rien malheureusement

    A moins que je ne l'utilise mal ?

    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
    void __fastcall TMonThreadFTP::Execute()
    {
    TIdTime *time = new TIdTime(NULL);
    TIdFTP *idftp = new TIdFTP(NULL);
     
    idftp->Host = "...";
    idftp->User = "...";
    idftp->Password = "...";
    idftp->Port = 21;
     
    idftp->Passive = false;
    time->Timeout = 10;
     
    while(!this->Terminated)
    {
            idftp->Connect();   // Il reste bloqué par exemple indéfiniment ici !!
     
            Suspend();
    }
    delete time;
    delete idftp;
    }

  6. #6
    Membre éclairé Avatar de benj63
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mai 2002
    Messages
    207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 207
    Par défaut
    J'ai tenté également des trucs avec IdAntiFreeze, soit je l'utilise mal, soit je ne comprends pas comment il fonctionne car rien ne change, mon prog se bloque toujours....

  7. #7
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2005
    Messages
    351
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2005
    Messages : 351
    Par défaut
    J'avais eu le même problème: le transfert se "figeait" sans raison jusqu'à ce que je remarque que les timeout de TidFTP sont par défaut à 0 (attente illimitée).

    En mettant les propriétés "ReadTimeout" et "TransferTimeout" à 5000ms, j'ai réglé le problème.... Par contre il faut gérer le renvoie de la requête si elle échoue.

    En espèrant que cela t'aidra

    Edit: j'utilise les composantes de RAD Studio 2007

Discussions similaires

  1. Rappel en cas de non réponse
    Par wizard0147 dans le forum VBA Outlook
    Réponses: 0
    Dernier message: 07/09/2009, 11h11
  2. Réponses: 2
    Dernier message: 24/09/2008, 10h48
  3. Stopper un Shell en cas de non réponse
    Par stigma dans le forum Access
    Réponses: 2
    Dernier message: 05/10/2006, 10h03
  4. Réponses: 1
    Dernier message: 10/02/2006, 19h07

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