29. april 2009 - 22:03 Der er 4 kommentarer og
1 løsning

Periodisk fejl ved upload med IdFtp

Jeg har et hjemmelavet afviklingsprogram kørende på en lokalradio, som selv kan uploade playlister når stationen er ubemandet.
Det vil sige at afviklingsprogrammet kan generere de html filer der skal uploades.
Hvis jeg indbygger upload  rutinerne i afviklingsprogrammet, så enten fryser det periodisk eller det genstarter periodisk.
Hvis det blot skal generere html filerne, så kører det fint.
Ok, tænkte jeg, så laver jeg da blot et selvstændig program som kan klare upload.

Der er en timer der trigger hvert femte sekund.

procedure TForm1.Timer2Timer(Sender: TObject);
var
  LokalFilNavn, EksternFilNavn: String;
begin  // Checker om der er nye filer der skal uploades, og uploader dem.
  Timer2.Enabled := False;  // Det kunne tage mere end 5 sekunder.
  LokalFilNavn := 'wwwPlaylistOversigt.htm';
  EksternFilNavn := HentNogleVardi(LokalFilNavn); // Læser i databasen om der er en ny oversigt klar.
  if EksternFilNavn <> '' then
  begin  // Ny oversigt til upload.
    SletGamleFiler;
    UploadToPlaylists(LokalFilNavn, EksternFilNavn); // Uploader oversigt
  end;
  LokalFilNavn := 'wwwPlaylist.htm';
  EksternFilNavn := HentNogleVardi(LokalFilNavn);  // Læser i databasen om der er en ny playlist klar.
  if EksternFilNavn <> '' then
  begin  // Ny playlist til upload.
    UploadToPlaylists(LokalFilNavn, EksternFilNavn); // Uploader playlist.
  end;
  Timer2.Enabled := True;
end;

procedure TForm1.UploadToPlaylists(Source, Dest: String);
begin
  if Ens(HentLokal('ID'), 'Teknik') then
  begin  // Kun PC'en i teknikken må uploade playlister.
    if Upload(HentLokal('WWW.') + Source, Dest, 'Playlists') then
      SletNogleVardi(Source); // Fortæl afviklingsprogrammet at upload er gennemført.
  end;
end;

function TForm1.UpLoad(Source, Dest, Mappe: String): Boolean;
begin
  try
    IdFTP.Host    := HentNogleVardi('wwwHjemmeside'); 
    IdFTP.Username := HentNogleVardi('wwwBrugernavn'); 
    IdFTP.Password := HentNogleVardi('wwwAdgangskode');
    if not IdFTP.Connected then IdFTP.Connect;
    IdFTP.ChangeDir('/www/' + Mappe + '/');  //skift evt. dir
    IdFTP.Put(Source, Dest, False);
    GemNotat(Source + ' er uploadet');  // Skriv i logfil, at upload lykkedes.
    IdFTP.Disconnect;
    UpLoad := True; // Upload lykkedes.
  except
    on E: Exception do
    begin
      GemNotat(Source + ' kan ikke uploades ' + E.Message);  // Skriv i logfil, at upload mislykkedes.
      UpLoad := False; // UpLoad mislykkedes.
    end;
  end;
end;

procedure TForm1.GemNotat(N: String);
var
  Fil: TextFile;
begin
  AssignFile(Fil, 'C:\Uploader.log');  // Åben log fil.
  if FileExists('C:\Uploader.log') then
    Append(Fil)
  else
    Rewrite(Fil);
  Writeln(Fil, DateToStr(Date) + ', ' + TimeToStr(Time) + ', ' + N);
  CloseFile(Fil);  // Luk log fil.
end;

Her er en del af logfilen.
Læg mærke til tidspunktet, den prøver hvert femte sekund, mange gange mislykkes det, men somme tider lykkes det.

27-04-2009, 08:51:06, D:\Musik\www\wwwPlaylist.htm er uploadet
27-04-2009, 08:54:57, D:\Musik\www\wwwPlaylist.htm er uploadet
27-04-2009, 08:57:42, D:\Musik\www\wwwPlaylist.htm kan ikke uploades Socket Error # 10054
Connection reset by peer.
27-04-2009, 08:57:47, D:\Musik\www\wwwPlaylist.htm kan ikke uploades Socket Error # 10054
Connection reset by peer.
27-04-2009, 08:57:52, D:\Musik\www\wwwPlaylist.htm kan ikke uploades Socket Error # 10054
Connection reset by peer.
27-04-2009, 08:57:57, D:\Musik\www\wwwPlaylist.htm kan ikke uploades Socket Error # 10054
Connection reset by peer.
27-04-2009, 08:58:02, D:\Musik\www\wwwPlaylist.htm kan ikke uploades Socket Error # 10054
Connection reset by peer.
27-04-2009, 08:58:07, D:\Musik\www\wwwPlaylist.htm kan ikke uploades Socket Error # 10054
Connection reset by peer.
27-04-2009, 08:58:12, D:\Musik\www\wwwPlaylist.htm kan ikke uploades Socket Error # 10054
Connection reset by peer.
27-04-2009, 08:58:19, D:\Musik\www\wwwPlaylist.htm er uploadet
27-04-2009, 08:59:55, D:\Musik\www\wwwPlaylist.htm er uploadet
27-04-2009, 09:06:17, D:\Musik\www\wwwPlaylist.htm er uploadet
27-04-2009, 09:09:08, D:\Musik\www\wwwPlaylist.htm er uploadet
27-04-2009, 09:13:10, D:\Musik\www\wwwPlaylist.htm er uploadet
27-04-2009, 09:16:06, D:\Musik\www\wwwPlaylist.htm er uploadet
27-04-2009, 09:18:57, D:\Musik\www\wwwPlaylist.htm er uploadet
27-04-2009, 09:22:09, D:\Musik\www\wwwPlaylist.htm er uploadet
27-04-2009, 09:29:15, D:\Musik\www\wwwPlaylist.htm er uploadet
Her er der kørt manuel radio, derfor er der ingen playlist genereret.
27-04-2009, 16:00:04, D:\Musik\www\wwwPlaylistOversigt.htm er uploadet
27-04-2009, 16:01:59, D:\Musik\www\wwwPlaylist.htm kan ikke uploades Socket Error # 10054
Connection reset by peer.
27-04-2009, 16:02:04, D:\Musik\www\wwwPlaylist.htm kan ikke uploades Socket Error # 10054
Connection reset by peer.
27-04-2009, 16:02:10, D:\Musik\www\wwwPlaylist.htm er uploadet
27-04-2009, 16:04:50, D:\Musik\www\wwwPlaylist.htm kan ikke uploades Socket Error # 10054
Connection reset by peer.
27-04-2009, 16:04:56, D:\Musik\www\wwwPlaylist.htm er uploadet
27-04-2009, 16:08:48, D:\Musik\www\wwwPlaylist.htm er uploadet
27-04-2009, 16:12:38, D:\Musik\www\wwwPlaylist.htm kan ikke uploades Socket Error # 10054
Connection reset by peer.
27-04-2009, 16:12:43, D:\Musik\www\wwwPlaylist.htm kan ikke uploades Socket Error # 10054
Connection reset by peer.
27-04-2009, 16:12:48, D:\Musik\www\wwwPlaylist.htm kan ikke uploades Socket Error # 10054
Connection reset by peer.
27-04-2009, 16:12:53, D:\Musik\www\wwwPlaylist.htm kan ikke uploades Socket Error # 10054
Connection reset by peer.
27-04-2009, 16:12:58, D:\Musik\www\wwwPlaylist.htm kan ikke uploades Socket Error # 10054
Connection reset by peer.
27-04-2009, 16:13:03, D:\Musik\www\wwwPlaylist.htm kan ikke uploades Socket Error # 10054
Connection reset by peer.
27-04-2009, 16:13:08, D:\Musik\www\wwwPlaylist.htm kan ikke uploades Socket Error # 10054
Connection reset by peer.
27-04-2009, 16:13:13, D:\Musik\www\wwwPlaylist.htm kan ikke uploades Socket Error # 10054
Connection reset by peer.
27-04-2009, 16:13:18, D:\Musik\www\wwwPlaylist.htm kan ikke uploades Socket Error # 10054
Connection reset by peer.
27-04-2009, 16:13:23, D:\Musik\www\wwwPlaylist.htm kan ikke uploades Socket Error # 10054
Connection reset by peer.
27-04-2009, 16:13:28, D:\Musik\www\wwwPlaylist.htm kan ikke uploades Socket Error # 10054
Connection reset by peer.
27-04-2009, 16:13:33, D:\Musik\www\wwwPlaylist.htm kan ikke uploades Socket Error # 10054
Connection reset by peer.
27-04-2009, 16:13:38, D:\Musik\www\wwwPlaylist.htm kan ikke uploades Socket Error # 10054
Connection reset by peer.
27-04-2009, 16:13:43, D:\Musik\www\wwwPlaylist.htm kan ikke uploades Socket Error # 10054
Connection reset by peer.
27-04-2009, 16:13:48, D:\Musik\www\wwwPlaylist.htm kan ikke uploades Socket Error # 10054
Connection reset by peer.
27-04-2009, 16:13:53, D:\Musik\www\wwwPlaylist.htm kan ikke uploades Socket Error # 10054
Connection reset by peer.
27-04-2009, 16:13:58, D:\Musik\www\wwwPlaylist.htm kan ikke uploades Socket Error # 10054
Connection reset by peer.
27-04-2009, 16:14:03, D:\Musik\www\wwwPlaylist.htm kan ikke uploades Socket Error # 10054
Connection reset by peer.
27-04-2009, 16:14:09, D:\Musik\www\wwwPlaylist.htm er uploadet
27-04-2009, 16:16:44, D:\Musik\www\wwwPlaylist.htm kan ikke uploades Socket Error # 10054
Connection reset by peer.
27-04-2009, 16:16:49, D:\Musik\www\wwwPlaylist.htm kan ikke uploades Socket Error # 10054
Connection reset by peer.
27-04-2009, 16:16:54, D:\Musik\www\wwwPlaylist.htm kan ikke uploades Socket Error # 10054
Connection reset by peer.
27-04-2009, 16:16:59, D:\Musik\www\wwwPlaylist.htm kan ikke uploades Socket Error # 10054
Connection reset by peer.
27-04-2009, 16:17:04, D:\Musik\www\wwwPlaylist.htm kan ikke uploades Socket Error # 10054
Connection reset by peer.
27-04-2009, 16:17:09, D:\Musik\www\wwwPlaylist.htm kan ikke uploades Socket Error # 10054
Connection reset by peer.
27-04-2009, 16:17:14, D:\Musik\www\wwwPlaylist.htm kan ikke uploades Socket Error # 10054
Connection reset by peer.
27-04-2009, 16:17:21, D:\Musik\www\wwwPlaylist.htm er uploadet
Avatar billede arne_v Ekspert
30. april 2009 - 04:50 #1
Jeg har set lignende problemer med masse upload (ikke i Delphi).

Mit forslag:
- sæt en pause på 50 millisekunder ind mellem hver upload
- hvis du får exception så venter du 250 millisekunder og uploader så den samme fil igen

Ikke specielt elegant, men det virker.
Avatar billede kroning Nybegynder
30. april 2009 - 08:19 #2
Har haft ligende problem, hos mig virkede det at oprette FTP komponenten at runtime i stedet for design time, dvs.:

IdFTP:=TIdFTP.Create(...
IdFTP.Host    := HentNogleVardi('wwwHjemmeside');
IdFTP.Username := HentNogleVardi('wwwBrugernavn');
IdFTP.Password := HentNogleVardi('wwwAdgangskode');
.
.
.
IdFTP.Free;
04. maj 2009 - 08:54 #3
Hej Arne.
Jeg satte en pause på 50 millisekunder ind imellem Connect og ChangeDir. Så virker det.
    if not IdFTP.Connected then IdFTP.Connect;
    Sleep(50);
    IdFTP.ChangeDir('/www/' + Mappe + '/');  //skift evt. dir
    IdFTP.Put(Source, Dest, False);
Kan du forklare mig hvorfor Connect metoden afsluttes før der er konstateret forbindelse?
Forbindelsen når jo at etableres i løbet af 50 millisekunder.
Læg et svar så du kan få point.
Avatar billede arne_v Ekspert
11. maj 2009 - 04:14 #4
Jeg ved ikke helt hvad der sker. Mit gæt er at det er et problem med at genbruge porte. Det hører med til historien at FTP bruger to connections. En control connection og en data connection. Control connectioner permanent åben under sessionen. Der etableres en data connection for hver fil overførsel. Mit gæt er at når en data connection lukkes så varer det X millisekunder inden OS tillader at porten genbruges.
Avatar billede arne_v Ekspert
11. maj 2009 - 04:14 #5
Og svar.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester