- 实例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;
- }