Добавьте переменную в структуру ftpfile, чтобы понять, что вашей функции записи необходимо добавить и сказать libcurl возобновить загрузку с конца файла назначения, установив для CURLOPT_RESUME_FROM количество загруженных байтов:
struct FtpFile
{
const char *pcInfFil;
FILE *pFd;
int iAppend;
};
В основном, если вы хотите возобновить:
curl_easy_setopt(curl, CURLOPT_RESUME_FROM , numberOfBytesToSkip);
Если файл еще не существует или это не возобновленная загрузка, а новая загрузка, обязательно установите для CURLOPT_RESUME_FROM значение 0.
В my_fwrite:
out->stream=fopen(out->filename, out->iAppend ? "ab":"wb");
P.S. если вам нужно возобновить файл больше, чем long (2 ГБ), посмотрите CURLOPT_RESUME_FROM_LARGE и CURL_OFF_T_C ()
В ответ на комментарий, запрашивающий дополнительную информацию о том, как узнать, когда передача не удалась:
После того, как вы наберете curl, просто выполните вызов:
CURLcode curl_easy_getinfo(CURL *curl, CURLINFO info, ... );
Извлечение из контекста curl:
CURLINFO_HEADER_SIZE
CURLINFO_CONTENT_LENGTH_DOWNLOAD
Сложите их вместе и убедитесь, что они равны
CURLINFO_SIZE_DOWNLOAD
Если нет, попытайтесь повторить контекст.
И обязательно используйте последнюю версию curl, она должна прерваться через 60 секунд после того, как не будет слышен FTP-сервер, с которого она загружается.