• resume.c


    resume.c

      

     1 //采用CURLOPT_RESUME_FROM_LARGE 实现文件断点续传功能
     2 #include <stdlib.h>
     3 #include <stdio.h>
     4 #include <sys/stat.h>
     5 #include <curl/curl.h>
     6 //这个函数为CURLOPT_HEADERFUNCTION 参数构造
     7 /*从http 头部获取文件size*/
     8 size_t getcontentlengthfunc(void *ptr, size_t size, size_t nmemb, void *stream) {
     9 int r;
    10 long len = 0;
    11 /* _snscanf() is Win32 specific */
    12 // r = _snscanf(ptr, size * nmemb, "Content-Length: %ld
    ", &len);
    13 r = sscanf(ptr, "Content-Length: %ld
    ", &len);
    14 if (r) /* Microsoft: we don't read the specs */
    15 *((long *) stream) = len;
    16 return size * nmemb;
    17 }
    18 /*保存下载文件*/
    19 size_t wirtefunc(void *ptr, size_t size, size_t nmemb, void *stream)
    20 {
    21 return fwrite(ptr, size, nmemb, stream);
    22 }
    23 /*读取上传文件*/
    24 size_t readfunc(void *ptr, size_t size, size_t nmemb, void *stream)
    25 {
    26 FILE *f = stream;
    27 size_t n;
    28 if (ferror(f))
    29 return CURL_READFUNC_ABORT;
    30 n = fread(ptr, size, nmemb, f) * size;
    31 return n;
    32 }
    33 //下载或者上传文件函数
    34 int download(CURL *curlhandle, const char * remotepath, const char * localpath,
    35 long timeout, long tries)
    36 {
    37 FILE *f;
    38 curl_off_t local_file_len = -1 ;
    39 long filesize =0 ;
    40 CURLcode r = CURLE_GOT_NOTHING;
    41 int c;
    42 struct stat file_info;
    43 int use_resume = 0;
    44 /*得到本地文件大小*/
    45 //if(access(localpath,F_OK) ==0)
    46 if(stat(localpath, &file_info) == 0)
    47 {
    48 local_file_len = file_info.st_size;
    49 use_resume = 1;
    50 }
    51 //采用追加方式打开文件,便于实现文件断点续传工作
    52 f = fopen(localpath, "ab+");
    53 if (f == NULL) {
    54 perror(NULL);
    55 return 0;
    56 }
    57 //curl_easy_setopt(curlhandle, CURLOPT_UPLOAD, 1L);
    58 curl_easy_setopt(curlhandle, CURLOPT_URL, remotepath);
    59 curl_easy_setopt(curlhandle, CURLOPT_CONNECTTIMEOUT,
    60 timeout); //设置连接超时,单位秒
    61 //设置http 头部处理函数
    62 curl_easy_setopt(curlhandle, CURLOPT_HEADERFUNCTION,
    63 getcontentlengthfunc);
    64 curl_easy_setopt(curlhandle, CURLOPT_HEADERDATA, &filesize);
    65 //设置文件续传的位置给libcurl
    66 curl_easy_setopt(curlhandle, CURLOPT_RESUME_FROM_LARGE,
    67 use_resume?local_file_len:0);
    68 curl_easy_setopt(curlhandle, CURLOPT_WRITEDATA, f);
    69 curl_easy_setopt(curlhandle, CURLOPT_WRITEFUNCTION, wirtefunc);
    70 //curl_easy_setopt(curlhandle, CURLOPT_READFUNCTION, readfunc);
    71 //curl_easy_setopt(curlhandle, CURLOPT_READDATA, f);
    72 curl_easy_setopt(curlhandle, CURLOPT_NOPROGRESS, 1L);
    73 curl_easy_setopt(curlhandle, CURLOPT_VERBOSE, 1L);
    74 r = curl_easy_perform(curlhandle);
    75 fclose(f);
    76 if (r == CURLE_OK)
    77 return 1;
    78 else {
    79 fprintf(stderr, "%s
    ", curl_easy_strerror(r));
    80 return 0;
    81 }
    82 }
    83 int main(int c, char **argv) {
    84 CURL *curlhandle = NULL;                //定义一个指针
    85 curl_global_init(CURL_GLOBAL_ALL);        //初始化libcurl库
    86 curlhandle = curl_easy_init();            //获得指针
    87 //download(curlhandle, "ftp://user:pass@host/path/file", "C:\file", 0, 3);
    88 download(curlhandle , "http://software.skyunion.cn/index.asp","/work/index.asp",1,3);
    89 curl_easy_cleanup(curlhandle);
    90 curl_global_cleanup();
    91 return 0;
    92 }
  • 相关阅读:
    uva 1606 amphiphilic carbon molecules【把缩写写出来,有惊喜】(滑动窗口)——yhx
    Uva10082 WERTYU -S.B.S.
    Quicksum-S.B.S.
    NOIP2014提高组 DAY1 -SilverN
    NOIP2013普及组 -SilverN
    uva 1354 Mobile Computing ——yhx
    UVa 11292 Dragon of Loowater
    UVa 839 Not so Mobile
    Quicksum -SilverN
    uva 140 bandwidth (好题) ——yhx
  • 原文地址:https://www.cnblogs.com/jikexianfeng/p/5742368.html
Copyright © 2020-2023  润新知