Entwickler-Ecke

Internet / Netzwerk - idFTP: Programmfreeze vermeiden


delphiuserno1 - Mi 19.09.07 17:00
Titel: idFTP: Programmfreeze vermeiden
Hi

Ich hab n Problem mit der idFTP Komponente. und zwar soll der eine Datei von einem FTP Server downloaden. wenn allerdings keine Internetverbindung besteht oder die Firewall das Programm blockt, dann friert das Programm kurzzeitig ein wenn der befehl

idftp1.connect;

ausgeführt wird. Es kommt ne socket fehlermeldung die ich auch abfange und so nur das Programm soll nicht einfrieren!
Gibt es da ne Lösung für? Ich hab das selbe mal mit der Indy FTP demo probiert, doch das friert auch ein für ne kurze zeit (2-3sec).

Ich hab mal hier im forum n bisschen gesucht und hab diesen code mal getestet:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
function isHostAvailable(Host:String):boolean;
  var
     MS: Integer;
    ICMP: TidIcmpClient;
  begin
    ICMP:= TidICMPClient.Create(nil);
    result:= False;
    ICMP.Host:= host;
    ICMP.Ping;
    MS:=ICMP.ReplyStatus.MsRoundTripTime;
    result:= ICMP.ReplyStatus.ReplyStatusType <> rsTimeOut;
    ICMP.Free;
  end;


Allerdings scheint Indy10 "ICMP.ReplyStatus" nicht zu kennen. keine ahnung wieso. (hab Delphi 2007)

Also wäre super wenn mir jemand helfen kann. ich muss irgendwie die verfügbarkeit des hostes prüfen ohne das das programm einfriert!

Gruß


-Luzifer - Mi 19.09.07 17:05

IdAntiFreeze


delphiuserno1 - Mi 19.09.07 17:47

muss ich da noch irgendetwas aufrufen? weil nur das teil auf die form legen klappt nich obwohl es active is...


Narses - Sa 22.09.07 00:43
Titel: Re: idFTP: Programmfreeze vermeiden
Moin!

user profile icondelphiuserno1 hat folgendes geschrieben:
Ich hab n Problem mit der idFTP Komponente. und zwar soll der eine Datei von einem FTP Server downloaden. wenn allerdings keine Internetverbindung besteht oder die Firewall das Programm blockt, dann friert das Programm kurzzeitig ein wenn der befehl

idftp1.connect;

ausgeführt wird. Es kommt ne socket fehlermeldung die ich auch abfange und so nur das Programm soll nicht einfrieren!
Gibt es da ne Lösung für?

Ja, die Einfachste ist, deinen Download-Code in einen eigenen Thread auszulagern! :idea:

user profile icondelphiuserno1 hat folgendes geschrieben:
Ich hab mal hier im forum n bisschen gesucht und hab diesen code mal getestet:function isHostAvailable(Host:String):boolean;

Mal zur Erläuterung: das ist praktisch ein Ping an diesen Host. Damit kannst du feststellen, ob der Host im Netzwerk erreichbar ist oder nicht. Allerdings ist der Indy-basierte Ping nicht soo toll, denn er setzt Admin-Rechte voraus, weil die Indy-Entwickler dafür auf RawSockets aufgesetzt haben. Es gibt hier eine Alternative [http://www.delphi-forum.de/topic_ICMPEchoAPI+quotPingquot+WrapperUnit_53259.html], die ohne Admin-Rechte auskommt.

user profile icondelphiuserno1 hat folgendes geschrieben:
ich muss irgendwie die verfügbarkeit des hostes prüfen ohne das das programm einfriert!

Grundsätzlich liefert ein Ping zwar die Info, ob der Host erreichbar ist, aber deshalb muss ein FTP-Connect noch lange nicht erfolgreich sein! :mahn:

cu
Narses