Problema IndyFTP Client Connection Closed Gracefull

di il
4 risposte

Problema IndyFTP Client Connection Closed Gracefull

Ciao, ho queste que funzioni per gestire un collegamento ad un server FTP

function TFTPConnection.isConnected: boolean;
begin
  try
    FTP.Noop;
    Result := FTP.LastCmdResult.Code = '200';
  except
    on E: Exception do
      begin
        Log.Error((E.ClassName +  ': ' +  E.Message), 'TFTPConnection.isConnected');
        FTP.Disconnect;
        Result := false;
      end;
  end;
end;


function TFTPConnection.CheckConnection: boolean;
var i, risposta: integer;
    FTPs : PFTPConnectionSettings;
begin
  // Se non è connesso si connette all'ftp
  if not IsConnected then

  //if not FTP.Connected then
    for i := 0 to Count - 1 do
      begin
        try
          FTPS          := Items[i];
          FTP.Host      := FTPS.host;
          FTP.Port      := FTPS.port;
          FTP.Username  := FTPS.username;
          FTP.password :=  FTPS.password;
          FTP.Connect;
          connectionTime := now;
          ftpAfterClientLogin(Self);
          TryToConnectionCount := 0;
          Break;
        except
          on E: Exception do
            begin
              Log.Error((E.ClassName +  ': ' +  E.Message), 'TFTPConnection.CheckConnection');
              inc(TryToConnectionCount);
              Sleep(10000);
            end;
        end;
      end;
  Result := FTP.Connected;
end;

nei log ho questi errori:

2024-08-22 02:33:40:922 [TID     3836][ERROR  ] EIdConnClosedGracefully: Connection Closed Gracefully. [TFTPConnection.isConnected]
2024-08-22 02:33:40:922 [TID     3836][ERROR  ] EIdAlreadyConnected: Already connected. [TFTPConnection.CheckConnection]
2024-08-22 02:33:50:938 [TID     3836][ERROR  ] EIdConnClosedGracefully: Connection Closed Gracefully. [TINewsRundown.LoadDir]
2024-08-22 02:33:50:984 [TID     3836][ERROR  ] EIdConnClosedGracefully: Connection Closed Gracefully. [TFTPConnection.isConnected]

Sembra che il componente ftp pensi di essere ancora connesso e quindi non faccia la riconnessione.
Avete qualche idea o correzione al codice da suggerire?

ChatGPT suggerisce l'idea estrema di ricreare il componente. in effetti non ci avevo pensato…


Grazie in anticipo,

Andrea.

4 Risposte

  • Re: Problema IndyFTP Client Connection Closed Gracefull

    22/08/2024 - Andrea08 ha scritto:


    nei log ho questi errori:

    2024-08-22 02:33:40:922 [TID     3836][ERROR  ] EIdConnClosedGracefully: Connection Closed Gracefully. [TFTPConnection.isConnected]
    2024-08-22 02:33:40:922 [TID     3836][ERROR  ] EIdAlreadyConnected: Already connected. [TFTPConnection.CheckConnection]
    2024-08-22 02:33:50:938 [TID     3836][ERROR  ] EIdConnClosedGracefully: Connection Closed Gracefully. [TINewsRundown.LoadDir]
    2024-08-22 02:33:50:984 [TID     3836][ERROR  ] EIdConnClosedGracefully: Connection Closed Gracefully. [TFTPConnection.isConnected]

    Sembra che il componente ftp pensi di essere ancora connesso e quindi non faccia la riconnessione.

    L'eccezione EIdConnClosedGracefully si verifica in genere quando il server chiude la connessione, ed è di norma una situazione plausibile e abbastanza normale; ad esempio, mi veniva sollevata sempre quando mandavo un messaggio di “quit” al server SMTP il quale, come risposta, chiudeva la connessione e - per segnalare questo evento - il componente Indy sollevava appunto questa eccezione.

    Non capisco però bene qual è il problema. Di fatto, quando si verifica, il client risulta disconnesso, e non si riconnette da solo.
    Occorre eseguire il comando di connessione nuovamente per riprendere il colloquio con il server.

  • Re: Problema IndyFTP Client Connection Closed Gracefull

    22/08/2024 - Alka ha scritto:


    Non capisco però bene qual è il problema. Di fatto, quando si verifica, il client risulta disconnesso, e non si riconnette da solo.
    Occorre eseguire il comando di connessione nuovamente per riprendere il colloquio con il server.

    Hai ragione, scusa, manca un pezzo.
    queste funzioni vengono chiamate ciclicamente da un timer ogni 5 secondi prima di un DIR sull'FTP, per verificare il cambiamento dei file su una directory.
    il mio problema è che (anche se non dovrebbe) il serve si disconnette ma, alla chiamata successiva, dovrebbe riconnettersi automaticamente invece non lo fa sollevando l'eccezione “Already connected”.

    Spero di essere stato più chiaro. 

  • Re: Problema IndyFTP Client Connection Closed Gracefull

    22/08/2024 - Andrea08 ha scritto:


    queste funzioni vengono chiamate ciclicamente da un timer ogni 5 secondi prima di un DIR sull'FTP, per verificare il cambiamento dei file su una directory.

    Mi sembra molto “stringente” questo intervallo, considerando quanto è poco efficiente il protocollo FTP (si tratta di 12 controlli al minuto!).

    In ogni caso, non è sufficiente disconnettersi in modo esplicito prima di effettuare un nuovo controllo?

    L'operazione dovrebbe essere un 1) mi connetto, 2) faccio le mie operazioni, 3) mi disconnetto dal server, 4) ripeto.

  • Re: Problema IndyFTP Client Connection Closed Gracefull

    22/08/2024 - Alka ha scritto:


    Mi sembra molto “stringente” questo intervallo,

    É vero ma è necessario.
    É un server specifico che simula un FTP per alcune tipologie di interrogazione quindi è in grado di sopportare quel carico.

    Continuo a spulciare nel codice :)

    Andrea.

Devi accedere o registrarti per scrivere nel forum
4 risposte