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