Estoy tratando de descargar un archivo usando FTP, y en el medio si la conexión termina, entonces debe continuar desde donde se detuvo. Mi problema es que al usar el siguiente fragmento de código puedo continuar la descarga si cierro la conexión y luego la vuelvo a conectar, pero si lo hago en el sitio del servidor, entonces no puedo reanudar la descarga y el programa entra en estado infinito.Cómo reanudar la descarga de archivos a través de FTP usando Curl en C?
#include <stdio.h>
#include <curl/curl.h>
/*
* This is an example showing how to get a single file from an FTP server.
* It delays the actual destination file creation until the first write
* callback so that it won't create an empty file in case the remote file
* doesn't exist or something else fails.
*/
struct FtpFile {
const char *filename;
FILE *stream;
};
static size_t my_fwrite(void *buffer, size_t size, size_t nmemb, void *stream)
{
struct FtpFile *out=(struct FtpFile *)stream;
if(out && !out->stream) {
/* open file for writing */
out->stream=fopen(out->filename, "wb");
if(!out->stream)
return -1; /* failure, can't open file to write */
}
return fwrite(buffer, size, nmemb, out->stream);
}
int main(void)
{
CURL *curl;
CURLcode res;
struct FtpFile ftpfile={
"dev.zip", /* name to store the file as if succesful */
NULL
};
curl_global_init(CURL_GLOBAL_DEFAULT);
curl = curl_easy_init();
if(curl) {
/*
* You better replace the URL with one that works!
*/
curl_easy_setopt(curl, CURLOPT_URL,
"ftp://root:[email protected]/dev.zip");
/* Define our callback to get called when there's data to be written */
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, my_fwrite);
/* Set a pointer to our struct to pass to the callback */
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &ftpfile);
/* Switch on full protocol/debug output */
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
res = curl_easy_perform(curl);
/* always cleanup */
curl_easy_cleanup(curl);
if(CURLE_OK != res) {
/* we failed */
fprintf(stderr, "curl told us %d\n", res);
}
}
if(ftpfile.stream)
fclose(ftpfile.stream); /* close the local file */
curl_global_cleanup();
return 0;
}
¿Alguien me puede decir que cómo puedo reanudar la descarga si la conexión está cerrada por un sitio remoto? Cualquier ayuda se agradece
Gracias,
Yuvi
¿Hay algo así como http 'AddRange' en ftp? –
sí, está allí, pero mi problema es que no puedo detectar el error si la conexión está cerrada, para saber un poco más puedes consultarlo aquí http://curl.haxx.se/libcurl/c/ftpuploadresume.html – Yuvi