Wie kann der Dateidownload über FTP mit Curl in C fortgesetzt werden?

8

Ich versuche, die Datei per FTP herunterzuladen, und zwischendurch, wenn die Verbindung beendet wird, sollte sie von dort wieder fortgesetzt werden, wo sie gestoppt wurde. Mein Problem ist, dass ich das folgende Code-Snippet benutze, um den Download fortzusetzen, wenn ich die Verbindung schließe und dann wieder verbinde, aber wenn ich das auf der Server-Site mache, kann ich den Download nicht fortsetzen, und das Programm geht in den Infinites-Zustand über. p> %Vor%

Kann mir jemand sagen, wie ich den Download fortsetzen kann, wenn die Verbindung von der Remote-Site geschlossen wird. Jede Hilfe würde geschätzt werden

Danke,

Yuvi

    
Yuvi 23.02.2012, 09:12
quelle

2 Antworten

2

Fügen Sie der ftpfile-Struktur ein Varail hinzu, um zu wissen, dass libcurl den Download am Ende der Zieldatei fortsetzen soll, indem Sie CURLOPT_RESUME_FROM auf die Anzahl der bereits heruntergeladenen Bytes setzen:

%Vor%

In main, wenn Sie fortfahren möchten:

%Vor%

Wenn die Datei noch nicht existiert oder es sich nicht um einen wiederaufgenommenen Download, sondern um einen neuen Download handelt, müssen Sie CURLOPT_RESUME_FROM wieder auf 0 setzen.

In my_fwrite:

%Vor%

P.S. Wenn Sie die Datei länger als 2 KB benötigen, schauen Sie in CURLOPT_RESUME_FROM_LARGE und CURL_OFF_T_C ()

nach

Als Antwort auf einen Kommentar, der zusätzliche Informationen dazu enthält, wie Sie wissen, wann eine Übertragung fehlgeschlagen ist:

Nachdem Sie curl easy aufgerufen haben, führen Sie einen Anruf durch:

%Vor%

Abrufen aus dem Curl-Kontext:

%Vor%

Fügen Sie sie zusammen und stellen Sie sicher, dass sie gleich sind

%Vor%

Wenn nicht, versuche den Kontext erneut zu erstellen.

Und stellen Sie sicher, dass Sie die neueste Version von curl verwenden, es sollte nach 60 Sekunden nicht mehr von dem FTP-Server, von dem es heruntergeladen wird, gehört werden.

    
Motes 23.02.2012, 14:19
quelle
0

Sie können die Parameter CURLOPT_CONNECTTIMEOUT und CURLOPT_TIMEOUT verwenden, um ein Verbindungszeitlimit und eine maximale Ausführungszeit pro Handle anzugeben.

Der andere Weg (der nur funktioniert, wenn Sie die easy-Schnittstelle verwenden, nicht die multiple), besteht darin, einen Socket-Option-Callback zu verwenden, den Sie mit CURLOPT_SOCKOPTFUNCTION setzen können. Darin müssen Sie für den Parameter SO_RCVTIMEO den Wert setsockopt () so lange angeben, bis eine Verbindung inaktiv ist, bevor sie gelöscht werden kann. Wenn in den letzten 5 Sekunden keine Bytes empfangen wurden, löschen Sie die Verbindung.

    
Radu Dan 16.03.2012 11:27
quelle

Tags und Links