各位亲 有时间可以去看看我的 “金骏家居淘宝店” http://jinjun1688.taobao.com/shop/view_shop.htm?tracelog=twddp 买时说明在我的博客看到有优惠哦 还有意外礼品赠送 真正的程序员淘宝店
头文件
//
// XXSimpleNetManager.h
// XXLib
//
#ifndef __XXLib__XXSimpleNetManager__
#define __XXLib__XXSimpleNetManager__
#include <iostream>
class XXSimpleNetManager {
/*
------------基于libcurl 的静态方法--------
*/
public:
/*
* @Description: 基于libcurl的同步 http get方法
* @prama[aUrl]: get请求的url
* @prama[&aResponseData]: get得到的数据返回
* @return: 操作结果 @see CURLcode
*/
staticint SimpleSyncGet(conststd::string& aUrl,std::string &aResponseData);
/*
* @Description: 基于libcurl的同步 http post方法
* @prama[aUrl]: post请求的url
* @prama[aPostData]:post给服务器的数据
* @prama[&aResponseData]: post请求到的数据
* @return: 操作结果 @see CURLcode
*/
staticint SimpleSyncPost(conststd::string& aUrl,conststd::string& aPostData,std::string &aResponseData);
/*
* @Description: 基于libcurl的同步下载文件方法
* @prama[aUrl]: 要下载的文件的请求url
* @prama[fp]: 本地要写入的文件的句柄
* @prama[aPosition]: 下载请求的文件起始位置(本地不完整文件的大小,默认为0表示从头下载)
* @return: 操作结果 @see CURLcode
*/
staticint SimpleSyncDownload(conststd::string& aUrl,FILE* fp,constlong& aPosition );
/*
* @Description: 基于libcurl的同步下载文件方法
* @prama[aUrl]: 要下载的文件的请求url
* @prama[aFileName]: 本地要写入的文件的名字
* @prama[aPosition]: 下载请求的文件起始位置(本地不完整文件的大小,默认为0表示从头下载)
* @return: 操作结果 @see CURLcode
*/
staticint SimpleSyncDownloadToFile(conststd::string& aUrl,conststd::string& aFileName,constlong& aPosition );
};
#endif /* defined(__XXLib__XXSimpleNetManager__) */
实现文件
//
// XXSimpleNetManager.cpp
// XXLib
//
#include "XXSimpleNetManager.h"
#import "curl.h"
#define VAN_CURL_DEBUG 0
#define VAN_CONNECT_TIMEOUT 5
#define VAN_POST_TIMEOUT 10
#define HTTP_RESPONSE_OK 200
//长途下载文件大小
double downloadFileLenth = 0;
//当地文件大小
double localFileLenth = 0;
staticsize_t OnWriteData(void* buffer,size_t size, size_t nmemb,void* lpVoid)
{
std::string* str =dynamic_cast<std::string*>((std::string *)lpVoid);
if(NULL == str ||NULL == buffer )
{
return -1;
}
char* pData = (char*)buffer;
str->append(pData, size * nmemb);
return nmemb;
}
staticsize_t OnDownLoadFile(void* buffer,size_t size, size_t nmemb,void* fp)
{
fwrite(buffer, size, nmemb, (FILE*)fp);
fflush((FILE*)fp);
return nmemb;
}
//基于libcurl的同步 http get方法
intXXSimpleNetManager::SimpleSyncGet(conststd::string& aUrl,std::string &aResponseData)
{
CURL *curl = curl_easy_init();
CURLcode res;
if (!curl) {
returnCURLE_FAILED_INIT;
}
curl_easy_setopt(curl,CURLOPT_URL, aUrl.c_str());
curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,OnWriteData);
curl_easy_setopt(curl,CURLOPT_WRITEDATA, (void *)&aResponseData);
res =curl_easy_perform(curl);
curl_easy_cleanup(curl);
return res;
}
//基于libcurl的同步 http post方法
intXXSimpleNetManager::SimpleSyncPost(conststd::string& aUrl,const std::string& aPostData,std::string &aResponseData)
{
CURL *curl = curl_easy_init();
CURLcode res;
if (!curl) {
returnCURLE_FAILED_INIT;
}
std::string jsonResponse;
curl_easy_setopt(curl,CURLOPT_URL, aUrl.c_str()); //这个 URL 是一个以 '\0' 结尾的字符串或参数指针 这个选项是唯一一个必须在 curl_easy_perform()调用之前就要设置的选项。
curl_easy_setopt(curl,CURLOPT_POSTFIELDS, aPostData.c_str());//传递一个作为HTTP “POST”操作的所有数据的字符串
curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,OnWriteData); //回调函数 用此来保存接收到的数据点大小
curl_easy_setopt(curl,CURLOPT_WRITEDATA, (void *)&aResponseData);//函数会将接收到的数据自动的写到这个 FILE 指针所指向的文件流中
curl_easy_setopt(curl,CURLOPT_NOSIGNAL, 1); //curl需要进行毫秒超时使用
curl_easy_setopt(curl,CURLOPT_CONNECTTIMEOUT,VAN_CONNECT_TIMEOUT);
curl_easy_setopt(curl,CURLOPT_TIMEOUT,VAN_POST_TIMEOUT); //设置一个长整形数,作为最大延续多少秒
res =curl_easy_perform(curl);
curl_easy_cleanup(curl);
return res;
// CURL *handler=curl_easy_init(); //初始化curl环境,新建curl对象,前往对象句柄
//
// if (!handler) {
// return CURLE_FAILED_INIT;
// }
// curl_easy_setopt(handler, CURLOPT_URL, aUrl.c_str()); //设置目的URL地址
// curl_easy_setopt(handler, CURLOPT_HEADER,1); //设置是否包含http头
// curl_easy_setopt(handler, CURLOPT_CONNECTTIMEOUT,30); //设置下载超时30秒则前往xiaz失败
// curl_easy_setopt(handler, CURLOPT_RESUME_FROM,0); //设置从0字节处下载
// // curl_easy_setopt(handler, CURLOPT_RESUME_FROM,"500-900"); 设置下载从500字节到900字节
// curl_easy_setopt(handler, CURLOPT_WRITEFUNCTION, OnWriteData); //设置回调的进度函数,设置后,会始终的调用进度函数,并传递参数总大小和已下载大小给该函数
//
//
// CURLcode res=curl_easy_perform(handler);//末尾执行下载操纵,若下载失败会前往错误码
}
//基于libcurl的同步下载文件方法
intXXSimpleNetManager::SimpleSyncDownload(conststd::string& aUrl,FILE* fp, constlong& aPosition )
{
CURL *curl = curl_easy_init();
CURLcode res;
if (!curl)
{
returnCURLE_FAILED_INIT;
}
curl_easy_setopt(curl,CURLOPT_URL, aUrl.c_str());//设置目的URL地址
curl_easy_setopt(curl,CURLOPT_HEADER,1); //设置是否包含http头
//curl_easy_setopt(curl, CURLOPT_RANGE, "2-6"); //传递一个你想指定的范围下载指定字节的文件块
curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,OnDownLoadFile);//回调函数 用此来保存接收到的数据点大小
curl_easy_setopt(curl,CURLOPT_WRITEDATA, fp);//函数会将接收到的数据自动的写到这个 FILE指针所指向的文件流中。
curl_easy_setopt(curl,CURLOPT_RESUME_FROM,0); //从0字节开始下载
curl_easy_setopt(curl,CURLOPT_CONNECTTIMEOUT, 10); //设置下载超时10秒
res =curl_easy_perform(curl);
curl_easy_cleanup(curl);
return res;
}
//基于libcurl的同步下载文件方法
intXXSimpleNetManager::SimpleSyncDownloadToFile(conststd::string& aUrl,conststd::string& aFileName,constlong& aPosition )
{
FILE* fp =fopen(aFileName.c_str(),"rb+");
int res =XXSimpleNetManager::SimpleSyncDownload(aUrl, fp,aPosition);
fclose(fp);
return res;
}
测试文件
//
// ViewController.m
// VanSimpleNetMessager
//
//
#import "ViewController.h"
#include "XXSimpleNetManager.h"
#import "curl.h"
using namespace std;
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad
{
[superviewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
// NSArray *paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
// NSLog(@"Get document path:%@",[paths objectAtIndex:0]);
// NSString *fileName=[[paths objectAtIndex:0]
// stringByAppendingPathComponent:@"myFiles11"];
// NSLog(@"-------");
// const char* cfilename = [fileName cStringUsingEncoding:NSUTF8StringEncoding];
std::string handler1="http://192.168.1.99/xampp/test/testFile.dmg";
std::string data;
XXSimpleNetManager::SimpleSyncGet(handler1, data);
NSLog(@"data==%s",data.c_str());
std::string handler2="http://192.168.1.99/Applications/XAMPP/xamppfiles/htdocs/xampp/test1";
std::string strDATA="hellloodofosofoso";
std::string ResponseData;
XXSimpleNetManager::SimpleSyncPost(handler2, strDATA, ResponseData);
NSLog(@"resPonsedats==%s",ResponseData.c_str());
std::string handler3="http://192.168.1.99/xampp/test/testFile.dmg";
NSArray *paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
NSLog(@"Get document path:%@",[pathsobjectAtIndex:0]);
NSString *fileName=[[pathsobjectAtIndex:0]
stringByAppendingPathComponent:@"myFiles11"];
constchar* cfilename = [fileNamecStringUsingEncoding:NSUTF8StringEncoding];
FILE *fptr;
structcurl_slist *http_head=NULL;
if ((fptr=fopen(cfilename,"wa")) ==NULL) {
fprintf(stderr,"fopen file error: %s\n",cfilename);
exit(1);
}
fseek(fptr, 0L, 2);
unsignedlong filesize =ftell(fptr);
NSLog(@"filesize2 == %d", (int)filesize);
long aPositiondata=filesize ;
XXSimpleNetManager::SimpleSyncDownload(handler3,fptr,aPositiondata );
NSLog(@"--------");
fclose(fptr);
if ((fptr=fopen(cfilename,"rb")) ==NULL) {
fprintf(stderr,"fopen file error: %s\n",cfilename);
exit(1);
}
char tmp[1024];
memset(tmp, 0,1024);
rewind(fptr);
fread(tmp, 1, 10, fptr);
NSLog(@"tmp==%s,,%ld",tmp,strlen(tmp));;
fclose(fptr);
}
- (void)didReceiveMemoryWarning
{
[superdidReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end