FTP und Timeout

Vom Front-End bis SOAP.

Moderator: Moderatoren

Antworten
Benutzeravatar
Markus Walter
Programmier-Gott
Programmier-Gott
Beiträge: 1018
Registriert: Di, 24. Jan 2006 10:22
Wohnort: Saarland

FTP und Timeout

Beitrag von Markus Walter »

Hallo,

nutzt jemand die xbpFTP-Klasse von Phil Ide oder die verwendeten API-Calls direkt (InternetOpenA, InternetConnectA, FtpGetFileA, FtpPutFileA, ...) und hat eine Lösung für einen Timeout. Wenn die Verbindung nicht klappt (Firewall oder was auch immer), dauert es je nach Rechner sehr lange (teilweise 10min), bis die Aufrufe "zurückkommen"...
Gruß
Markus

Mitglied der XUG Saarland-Pfalz
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: FTP und Timeout

Beitrag von UliTs »

Als Idee könnte man vielleicht einen zweiten Thread starten.
Damit könnte man problemlos ein TimeOut programmieren:
Wenn die Zeit um ist einfach im Haupt-Thread weitermachen (und den zweiten Thread nach endlich erfolgter Rückantwort :D ordnungsgemäß beenden).

Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: FTP und Timeout

Beitrag von brandelh »

Hi,

grundsätzlich haben diese Funktionen einen timeout, den man über die Flags steuern kann,
ich meine in seinem HTTP LoadFromUrl(), die auch FTP Dateien laden kann hätte ich sowas gesehen.
In den WinAPI Dateien zum Internet gibt es einige FLAG Variablen die TIMEOUT im Namen führen, allerdings habe ich mich nie mit FTP beschäftigt.
Gruß
Hubert
Benutzeravatar
Markus Walter
Programmier-Gott
Programmier-Gott
Beiträge: 1018
Registriert: Di, 24. Jan 2006 10:22
Wohnort: Saarland

Re: FTP und Timeout

Beitrag von Markus Walter »

@Uli: Das könnte im Prinzip funktionieren. An so eine Lösung habe ich auch schon gedacht: Die ftp-Aktion in einem seperaten Thread starten und im Hauptthread warten bis Antwort oder timeout und im Falle eines timeouts den separaten Thread einfach weiterlaufen lassen...
Aber ich glaubte (und glaube eigentlich immer noch), dass es da eine Möglichkeit geben muss, dass man den Timeout dieser Funktionen aus der WinInet.dll setzen kann...

@Hubert: Wo siehst Du denn diese Flags? Ich kann da nichts finden (auch nicht im LoadFromUrl)...
Gruß
Markus

Mitglied der XUG Saarland-Pfalz
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: FTP und Timeout

Beitrag von brandelh »

Hallo Markus,

du weißt doch, dass ich "fremd gehe" ähm... besser bei PowerBasic lese ;-)

Code: Alles auswählen

'------------------------------------------------------------------------------
'
'  WinINet.inc
'    Contains manifests, macros, types and prototypes for Microsoft Windows
'    Internet Extensions.
'
'  Copyright (C) 1999-2011 PowerBASIC, Inc.
'  Portions Copyright (C) Microsoft Corporation
'  All Rights Reserved.
'
'  Last updated 02 May 2011
'
'------------------------------------------------------------------------------
'  from wininet.h and winineti.h of 14 Jul 2009
'------------------------------------------------------------------------------
' The two #include files were combined to avoid circular reference problems.
'------------------------------------------------------------------------------
falls es dich interessiert, kann ich dir den DownLoad-Link der Win32API von PowerBasic zukommen lassen.
Die original WinINet.h Datei müsste man bei Microsoft im finden ... aber ich lese lieber Basic als C ;-)
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: FTP und Timeout

Beitrag von brandelh »

Hi,

im Internet habe ich nach der DLL gesucht und das gefunden:
:arrow: http://msdn.microsoft.com/en-us/library ... 85%29.aspx
:arrow: http://msdn.microsoft.com/en-us/library ... 85%29.aspx
beim Letzteren gibt es option flags, einige sehen nach timeout Werten aus.

Einfach mal die Befehle ansehen ...

In der ASINET Hilfe steht übrigens zu SocketSelect()

Code: Alles auswählen

SocketSelect( [<nReadFD>]  , ; 
              [<nWriteFD>] , ; 
              [<nExceptFD>], ; 
              [<aTimeOut>] , ; 
              [@<nError>]    ) --> nNumberOfSockets 

Parameters 
<nReadFD>
Numeric handle of a descriptor set of sockets to be checked for readability. 
<nWriteFD>
Numeric handle of a descriptor set of sockets to be checked for writability. 
<nExceptFD>
Numeric handle of a descriptor set of sockets to be checked for exceptions. 
<aTimeOut> := { nSeconds, nMicroSeconds }
The maximum time for the function to wait can be specified as an array with two elements. The first element is an integer number specifying the seconds, and the second element specifies a timeout period in 1/1000 seconds. 
<nError>
If this parameter is passed by reference to the function, it gets assigned a numeric error code when the function fails. #define constants beginning with WSAE are available in the file ASINETC.CH to identify an error condition. 
So wie ich das verstehe, sind die SOCKETs die Grundlagen der TCP/IP Kommunikation auch für FTP ... eventuell muss man also tiefer ansetzen um die Timeout Werte zu ändern.
Im LAN ist das wegbrechen einer Verbindung übrigens ein sicheres Mittel um den Rechner einige Zeit absolut zu blockieren. Er wartet dann auch auf den TimeOut ;-)

Hier findest du eine aktuelle FTP-Implementation, den Xbase++ Code und die Testversion:
:arrow: http://www.marshallsoft.com/ftp-client-library.htm
:arrow: http://www.marshallsoft.com/fce_ref.pdf

"Timeout" finde ich dort nicht, aber auf Seite 35 steht bei der Funktion fceSetInteger:

The fceSetInteger function sets the numeric parameter 'ParamName' to the value 'ParamValue'.
...
FCE_SET_CONNECT_WAIT is the maximum time allowed to complete a connection to the FTP server.

Ich würde mir diese holen und mich nicht auf den alten Code verlassen oder gar mit der Win32API experimentieren - außer das macht dir Spaß. ;-)
Gruß
Hubert
Benutzeravatar
Markus Walter
Programmier-Gott
Programmier-Gott
Beiträge: 1018
Registriert: Di, 24. Jan 2006 10:22
Wohnort: Saarland

Re: FTP und Timeout

Beitrag von Markus Walter »

Hallo Hubert,

InternetSetOptionA sieht ja nachdem aus, was ich brauche. Ich kriege es aber nicht hin, dass sich ein Effekt zeigt. Was durchaus an den Typen der beiden letzten Parameter liegen könnte. Da bin ich nicht sicher, wie man die aus Xbase übergeben muss...
Gruß
Markus

Mitglied der XUG Saarland-Pfalz
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: FTP und Timeout

Beitrag von brandelh »

Hallo Markus,

genau darum würde ich mir die Testversion von Marshallsoft laden und probieren ob es damit besser geht ;-)

Grundsätzlich sind solche Optionen aber LONG Werte, also einfach nWert = 0x?? oder nWert = 45 und dann werden die nOption1+nOption2 als Summe übergeben.
Eventuell braucht man auch komplexere Sachen, dann sollte man gleich die ot4xb für die Komminikation nutzen ... aber ich gebe mir das nicht. :D
Gruß
Hubert
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: FTP und Timeout

Beitrag von AUGE_OHR »

Markus Walter hat geschrieben:InternetSetOptionA sieht ja nachdem aus...
wenn ich dich richtig verstanden habe bekommst du keinen Internet "Connect" ... dann kann die "später" folgende "Option" kaum helfen.

Code: Alles auswählen

   if (InternetAttemptConnect(0) == ERROR_SUCCESS)
diese Zeile stellt IMHO fest ob du eine Verbindung hast..

Code: Alles auswählen

   i := InternetSetOptionA( nHTTPFile, INTERNET_OPTION_USERNAME, aAuthInfo[1], Len(aAuthInfo[1]))
   i := InternetSetOptionA( nHTTPFile, INTERNET_OPTION_PASSWORD, aAuthInfo[2], Len(aAuthInfo[2]))
diese Zeilen sind zur "Authorization"
gruss by OHR
Jimmy
Benutzeravatar
Markus Walter
Programmier-Gott
Programmier-Gott
Beiträge: 1018
Registriert: Di, 24. Jan 2006 10:22
Wohnort: Saarland

Re: FTP und Timeout

Beitrag von Markus Walter »

Hi,

wer sagt denn, dass InternetSetOptionA erst später gesetzt werden kann? Hier simuliere ich das Problem, in dem ich in der Firewall den Port gesperrt habe. Bei den Anwendern ist eher eine Sicherheitssoftware verantwortlich (Sicherheitssoftware fragt nach, ob eine Anwendung auf Internet zugreifen darf und der Anwender klickt nein). Leider sind die timeouts sehr unterschiedlich (bei mir hier ca. 30 Sekunden, ich hatte aber schon Anwender, da hat es 10min gedauert).
Gruß
Markus

Mitglied der XUG Saarland-Pfalz
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: FTP und Timeout

Beitrag von AUGE_OHR »

Markus Walter hat geschrieben:Hi,

wer sagt denn, dass InternetSetOptionA erst später gesetzt werden kann? Hier simuliere ich das Problem, in dem ich in der Firewall den Port gesperrt habe. Bei den Anwendern ist eher eine Sicherheitssoftware verantwortlich (Sicherheitssoftware fragt nach, ob eine Anwendung auf Internet zugreifen darf und der Anwender klickt nein). Leider sind die timeouts sehr unterschiedlich (bei mir hier ca. 30 Sekunden, ich hatte aber schon Anwender, da hat es 10min gedauert).

Code: Alles auswählen

IF (InternetAttemptConnect(0) == ERROR_SUCCESS)
nur wenn diese Zeile erfüllt ist wird "nachfolgender" Code ausgeführt.
Leider ergibt es ein "falsches" Resultat wenn du am Router hängst und der die IP "verteilt" ...

versuche es mal mit InternetCheckConnection Function http://msdn.microsoft.com/en-us/library ... 85%29.aspx
und überprüfe GetLastError
gruss by OHR
Jimmy
Antworten