libcurl编程实例,回调函数的使用
实例1:将请求的网页内容写入文件 // 将下载的网页写入文件 size_t PageDownloader::WriteData(void * ptr, size_t size, size_t nmemb, void * stream) { fp = fopen(PAGEFILE, "w+"); if ( fp == NULL) { return -1; } int written = fwrite(ptr, size, nmemb, fp); fclose(fp); return written; } // 请求网页,传入url int PageDownloader::Pagedownload(char *url) { CURL *curl; CURLcode code; curl_global_init(CURL_GLOBAL_ALL); curl = curl_easy_init(); if(NULL == curl) { return -1; } //设置下载的url curl_easy_setopt(curl, CURLOPT_URL, url); //设置超时时间 curl_easy_setopt(curl, CURLOPT_TIMEOUT, 30); //设置这个选项为1时,则输出的内容会包含头部信息;设置为0,则不会 // curl_easy_setopt(curl, CURLOPT_HEADER, 1); //设置这个选项为1的时,curl会自动跳转302 curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1); //设置数据处理函数:WriteData curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteData); code = curl_easy_perform(curl); if(CURLE_OK == code) { int status; //从curl句柄中获取附加信息:状态码 curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &status); if (200 != status) { return -1; } } curl_easy_cleanup(curl); return 0; }
实例2: // 处理HTTP SERVER返回头部信息... // 如果返回的头部信息中有多行,则会调用多次 static size_t header_callback(void *ptr, size_t size, size_t nmemb, void *stream) { string& buffer = *(static_cast<string*>(stream)); char *pBuf = (char *)ptr; size_t len = size * nmemb; for(size_t i = 0; i<len; ++i) { buffer += *pBuf; ++pBuf; } return len; } // 将获取的网页内容拼接起来,保存在一个string类型的变量中 size_t write_callback( char *ptr, size_t size, size_t nmemb, void *userdata) { string& buffer = *(static_cast<string*>(userdata)); size_t len = size * nmemb; for(size_t i = 0; i<len; ++i) { buffer += *ptr; ++ptr; } return len; } // 获取网页信息,参数是:首页Url、是否是手机网页、是否仅仅读取网页头部、需要返回的页面大小、需要返回的页面内容 int NetHelper::GetWebPageInfo( CString strUrl, bool bIsWap, bool bJustHeader, int& nFileSize, string& strContent ) { strContent.clear(); nFileSize =0; init_curl initcurl; CURL * curl = initcurl.get_curl(); CURLcode curlres; //如果libcurl初始化失败 if(!curl) { strContent = "curl初始化失败!"; return -1; } // 在堆栈上分配内存供 W2A等函数使用 USES_CONVERSION; // 设置URL curl_easy_setopt(curl, CURLOPT_URL, W2A(strUrl)); // 如果是ssl网站,不对ssl网站的证书进行验证 curl_easy_setopt(curl,CURLOPT_SSL_VERIFYPEER,0); curl_easy_setopt(curl,CURLOPT_SSL_VERIFYHOST,0); curl_easy_setopt(curl,CURLOPT_COOKIEJAR,"e:\cookie.txt"); curl_easy_setopt(curl,CURLOPT_COOKIEFILE,"e:\cookie.txt"); // 超时设置为10秒 curl_easy_setopt(curl,CURLOPT_TIMEOUT,10); // 如果只解析头部,就只将头部的内容保存在strContent,否则就将网页的内容(不包含网页头部)保存在strContent if ( !bJustHeader ) { // 设置读取HTTP返回内容的回调函数 curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback); // 设置回调函数的参数,见write_callback函数的最后一个参数 curl_easy_setopt(curl, CURLOPT_WRITEDATA, &strContent); }//end if else { // 设置读取HTTP头部内容的回调函数 curl_easy_setopt(curl,CURLOPT_HEADERFUNCTION,header_callback); // 设置回调函数的参数,见header_callback函数的最后一个参数, 如果没有用到 curl_easy_setopt(curl, CURLOPT_HEADERDATA, &strContent); // 设置不返回网页内容 curl_easy_setopt( curl, CURLOPT_NOBODY, 1 ); } // 自动跳转 curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1); // 设置http头 curl_slist *chunk = NULL; chunk = curl_slist_append( chunk, "Accept: text/html, application/xhtml+xml, */*" ); chunk = curl_slist_append( chunk, "Accept-Language: zh-CN" ); // 判断是否是手机网页 if ( bIsWap ) { 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" ); } //end if else { chunk = curl_slist_append( chunk, "User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.7 (KHTML, like Gecko)" ); } // chunk = curl_slist_append( chunk, "Accept-Encoding: gzip, deflate" ); //因为网页压缩会导致大小不一致,变来变去 chunk = curl_slist_append( chunk, "Connection: Keep-Alive" ); curl_easy_setopt( curl, CURLOPT_HTTPHEADER, chunk ); curlres = curl_easy_perform(curl); long nStatus; if( curlres == CURLE_OK ) { // 获取服务器返回码保存在nStatus中 curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &nStatus); // 整个网页的大小 nFileSize = strContent.size(); } else { nStatus = curlres; } return nStatus; }
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。
- 上一篇: 基于curl的异步http实现
- 下一篇: c++中创建一个三维数组