Seite 1 von 1

FTP und Timeout

Verfasst: Do, 14. Jul 2011 11:25
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"...

Re: FTP und Timeout

Verfasst: Do, 14. Jul 2011 11:40
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

Re: FTP und Timeout

Verfasst: Do, 14. Jul 2011 12:28
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.

Re: FTP und Timeout

Verfasst: Do, 14. Jul 2011 14:36
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)...

Re: FTP und Timeout

Verfasst: Do, 14. Jul 2011 14:47
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 ;-)

Re: FTP und Timeout

Verfasst: Do, 14. Jul 2011 15:14
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ß. ;-)

Re: FTP und Timeout

Verfasst: Fr, 15. Jul 2011 10:38
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...

Re: FTP und Timeout

Verfasst: Fr, 15. Jul 2011 10:57
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

Re: FTP und Timeout

Verfasst: Fr, 15. Jul 2011 22:56
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"

Re: FTP und Timeout

Verfasst: Mo, 18. Jul 2011 11:05
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).

Re: FTP und Timeout

Verfasst: Di, 19. Jul 2011 3:00
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