Bill
Bill

Reputation: 3033

Indy FTP EIAcceptTimeout Exception

I am testing IndyFTP to upload a file to a server. The file is uploaded but has 0 bytes because there is a EIdAccessTimeout exception - 'Accept timed out". How can I prevent the exception? Is my code incorrect? The code is shown below:

procedure TForm1.FTPUpload1Click(Sender: TObject);
{ Indy FTP Upload. }
var
  iHost: string;
  iUsername: string;
  iPassword: string;
  iFolder: string;
  iSourceFile: string;
  iDestFile: string;
  iAppend: boolean;
  iStartPos: Int64;
begin
  iHost := FTPHost1.Text;
  iUsername := Username1.Text;
  iPassword := Password1.Text;
  iFolder := ServerFolder1.Text;
  if FileExists(SourceFile1.Text) then
    iSourceFile := SourceFile1.Text
  else
    Exit;
  if FileExists(SourceFile1.Text) then
    iDestFile := ExtractFileName(SourceFile1.Text)
  else
    Exit;
  iAppend := False;
  iStartPos := -1;
  IdFTP1.Host := iHost;
  IdFTP1.Username := iUsername;
  IdFTP1.Password := iPassword;
  IdFTP1.Connect;
  IdFTP1.TransferType := ftBinary;
  IdFTP1.Put(iSourceFile);
  IdFTP1.Disconnect;
end;

There are some unused vars listed because I am just learning and have not used some of the parameters yet.

Upvotes: 2

Views: 2157

Answers (1)

Peter Kostov
Peter Kostov

Reputation: 951

Most likely, your FTP client is set to ACTIVE mode, so this error means that after a successful login to the FTP server, the "reverse" connection couldn't be established (the file transfer).

In active mode FTP the client connects from a random unprivileged port (N > 1023) to the FTP server's command port, port 21. Then, the client starts listening to port N+1 and sends the FTP command PORT N+1 to the FTP server. The server will then connect back to the client's specified data port from its local data port, which is port 20.

Active FTP vs. Passive FTP, a Definitive Explanation

You can set to passive mode this way:

IdFTP1.Passive := True;

EDIT

In addition, use try-except-finally blocks, so you can do some error handling. Something like:

  try
    IdFTP1.Connect;
    try
      IdFTP1.Put(...);
    finally
      IdFTP1.Disconnect;
    end;
  except
    // couldn't connect
  end;

Upvotes: 3

Related Questions