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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值