libcurl编程实例,回调函数的使用

[cpp]  view plain  copy
  1. 实例1:将请求的网页内容写入文件  
  2. // 将下载的网页写入文件  
  3. size_t PageDownloader::WriteData(void * ptr, size_t size, size_t nmemb, void * stream)  
  4. {  
  5.     fp = fopen(PAGEFILE, "w+");   
  6.     if ( fp == NULL)  
  7.     {  
  8.         return -1;  
  9.     }  
  10.     int written = fwrite(ptr, size, nmemb, fp);  
  11.     fclose(fp);  
  12.     return written;  
  13. }  
  14. // 请求网页,传入url  
  15. int PageDownloader::Pagedownload(char *url)  
  16. {  
  17.     CURL *curl;  
  18.     CURLcode code;  
  19.     curl_global_init(CURL_GLOBAL_ALL);  
  20.     curl = curl_easy_init();  
  21.     if(NULL == curl)  
  22.     {  
  23.         return -1;  
  24.     }  
  25.   
  26.     //设置下载的url  
  27.     curl_easy_setopt(curl, CURLOPT_URL, url);  
  28.     //设置超时时间  
  29.     curl_easy_setopt(curl, CURLOPT_TIMEOUT, 30);  
  30.     //设置这个选项为1时,则输出的内容会包含头部信息;设置为0,则不会  
  31. //  curl_easy_setopt(curl, CURLOPT_HEADER, 1);   
  32.     //设置这个选项为1的时,curl会自动跳转302  
  33.     curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1);  
  34.     //设置数据处理函数:WriteData  
  35.     curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteData);   
  36.   
  37.     code = curl_easy_perform(curl);  
  38.     if(CURLE_OK == code)  
  39.     {  
  40.         int status;  
  41.         //从curl句柄中获取附加信息:状态码  
  42.         curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &status);  
  43.         if (200 != status)  
  44.         {  
  45.             return -1;  
  46.         }  
  47.     }  
  48.   
  49.     curl_easy_cleanup(curl);  
  50.   
  51.     return 0;  
  52. }  
[cpp]  view plain  copy
  1. 实例2:  
  2. // 处理HTTP SERVER返回头部信息...  
  3. // 如果返回的头部信息中有多行,则会调用多次  
  4. static size_t header_callback(void *ptr, size_t size, size_t nmemb, void *stream)  
  5. {  
  6.  string& buffer = *(static_cast<string*>(stream));  
  7.  char *pBuf = (char *)ptr;  
  8.  size_t len = size * nmemb;  
  9.  for(size_t i = 0; i<len; ++i)  
  10.  {  
  11.   buffer += *pBuf;  
  12.   ++pBuf;  
  13.  }  
  14.  return len;  
  15. }  
  16.   
  17. // 将获取的网页内容拼接起来,保存在一个string类型的变量中  
  18. size_t write_callback( char *ptr, size_t size, size_t nmemb, void *userdata)  
  19. {  
  20.     string& buffer = *(static_cast<string*>(userdata));  
  21.     size_t len = size * nmemb;  
  22.     for(size_t i = 0; i<len; ++i)  
  23.     {  
  24.         buffer += *ptr;  
  25.           ++ptr;  
  26.    }  
  27.    return len;  
  28. }  
  29.   
  30. // 获取网页信息,参数是:首页Url、是否是手机网页、是否仅仅读取网页头部、需要返回的页面大小、需要返回的页面内容  
  31. int NetHelper::GetWebPageInfo( CString strUrl, bool bIsWap, bool bJustHeader, int& nFileSize, string& strContent )  
  32. {  
  33.     strContent.clear();  
  34.    nFileSize =0;  
  35.    init_curl initcurl;  
  36.    CURL * curl = initcurl.get_curl();  
  37.    CURLcode curlres;  
  38.       
  39.     //如果libcurl初始化失败  
  40.    if(!curl)  
  41.    {  
  42.        strContent = "curl初始化失败!";  
  43.        return -1;  
  44.    }  
  45.    // 在堆栈上分配内存供 W2A等函数使用  
  46.    USES_CONVERSION;  
  47.     // 设置URL  
  48.    curl_easy_setopt(curl, CURLOPT_URL, W2A(strUrl));  
  49.    // 如果是ssl网站,不对ssl网站的证书进行验证  
  50.    curl_easy_setopt(curl,CURLOPT_SSL_VERIFYPEER,0);  
  51.    curl_easy_setopt(curl,CURLOPT_SSL_VERIFYHOST,0);  
  52.   
  53.    curl_easy_setopt(curl,CURLOPT_COOKIEJAR,"e:\\cookie.txt");  
  54.    curl_easy_setopt(curl,CURLOPT_COOKIEFILE,"e:\\cookie.txt");  
  55.     // 超时设置为10秒  
  56.    curl_easy_setopt(curl,CURLOPT_TIMEOUT,10);  
  57.   
  58.     // 如果只解析头部,就只将头部的内容保存在strContent,否则就将网页的内容(不包含网页头部)保存在strContent  
  59.    if ( !bJustHeader )  
  60.    {  
  61.        // 设置读取HTTP返回内容的回调函数  
  62.        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback);  
  63.        // 设置回调函数的参数,见write_callback函数的最后一个参数  
  64.        curl_easy_setopt(curl, CURLOPT_WRITEDATA, &strContent);  
  65.      }//end if    
  66.    else  
  67.    {  
  68.           // 设置读取HTTP头部内容的回调函数  
  69.           curl_easy_setopt(curl,CURLOPT_HEADERFUNCTION,header_callback);  
  70.         // 设置回调函数的参数,见header_callback函数的最后一个参数, 如果没有用到  
  71.           curl_easy_setopt(curl, CURLOPT_HEADERDATA, &strContent);  
  72.           // 设置不返回网页内容  
  73.         curl_easy_setopt( curl, CURLOPT_NOBODY, 1 );  
  74.    }  
  75.    // 自动跳转  
  76.    curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1);  
  77.    // 设置http头  
  78.    curl_slist *chunk = NULL;  
  79.    chunk = curl_slist_append( chunk, "Accept: text/html, application/xhtml+xml, */*" );   
  80.    chunk = curl_slist_append( chunk, "Accept-Language: zh-CN" );   
  81.    
  82.     // 判断是否是手机网页  
  83.     if ( bIsWap )  
  84.    {  
  85.        chunk = curl_slist_append( chunk, "User-Agent: Mozilla/5.0 (Linux; U; Android 2.3.4; zh-cn; GT-I9100 Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1" );   
  86.    } //end if  
  87.    else  
  88.     {  
  89.           chunk = curl_slist_append( chunk, "User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.7 (KHTML, like Gecko)" );   
  90.    }  
  91.     //  chunk = curl_slist_append( chunk, "Accept-Encoding: gzip, deflate" );  //因为网页压缩会导致大小不一致,变来变去  
  92.    chunk = curl_slist_append( chunk, "Connection: Keep-Alive" );  
  93.    curl_easy_setopt( curl, CURLOPT_HTTPHEADER, chunk );  
  94.    curlres = curl_easy_perform(curl);  
  95.   
  96.    long nStatus;  
  97.    if( curlres == CURLE_OK )  
  98.    {  
  99.           // 获取服务器返回码保存在nStatus中  
  100.           curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &nStatus);  
  101.           // 整个网页的大小  
  102.           nFileSize = strContent.size();  
  103.    }  
  104.    else  
  105.    {  
  106.         nStatus = curlres;  
  107.    }  
  108.    return nStatus;  
  109. }  
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/meloyi/article/details/48175799

猜你喜欢

转载自blog.csdn.net/thanklife/article/details/80352269