Cocos2d-x中libcurl库的使用(2)curl_easy API的介绍

Cocos2d-x中libcurl库的使用(2)curl_easy API的介绍,第1张

概述一、curl_easy API适用于同步网络请求 1、初始化 CURL*  easy_handle = curl_easy_init(); 2、设置相关属性和 *** 作curl_easy_setopt函数 使用上面初始化的easy_handle,设置相关属性与 *** 作,其很多属性内部会自动拷贝这些字符串,curl_easy_setopt函数设置相关属性时,libcurl内部会自动拷贝这些字符串,所以设置完相

一、curl_easy API适用于同步网络请求

1、初始化

CURL* easy_handle = curl_easy_init();

2、设置相关属性和 *** 作curl_easy_setopt函数

使用上面初始化的easy_handle,设置相关属性与 *** 作,其很多属性内部会自动拷贝这些字符串,curl_easy_setopt函数设置相关属性时,libcurl内部会自动拷贝这些字符串,所以设置完相关属性后,字符串可以直接释放掉。

1)CURLOPT_CURL:设置最基本最常用的属性URL

curl_easy_setopt(easy_handle,CURLOPT_URL,"http://write.blog.csdn.net/postedit");

2)CURLOPT_WRITEFUNCTION:设置回调函数获取接收到的数据

curl_easy_setopt(easy_handle,CURLOPT_WRITEFUNCTION,write_data);

假如你要获取的URL所表示的远程主机上的资源,还需要写一段程序来完成数据的传输,完成数据的保存或打印。此时需要实现一个回调函数,来保存和接收数据。其函数原型如下:

size_t write_data(voID* buffer,size_t size,size_t nmemb,voID* user);

参数1:传递过来的数据地址

参数2和参数3:size*nmenb表示传递数据的大小

参数4:用户用于存放数据的地址

3)CURLOPT_WRITEDATA:传递接收数据的文件地址或字符串地址

curl_easy_setopt(easy_handle,CURLOPT_WRITEDATA,&internal_struct);

从socket角度考虑,传输过来的数据不一定会是以0结尾的字符串,而应当被认为是流数据,只要服务器端没有关闭连接,就会一直发送数据响应,这个函数就会被调用,被调用的次数也不一定只是1次,每一次被调用接收的数据大小是size*nmenb,user可以是一个file*指针,也可以是一个字符串指针,这个参数在CURLOPT_WRITEDATA中传入,如果自己写了回调函数,而不是用缺省的回调函数把接收到得数据写到用CURLOPT_WRITEDATA所设置的userdata所指向的文件当中去,那么就可以把这个指针设置为NulL。

一般2和3是结合使用的 4)curl_easy_perform(easy_handle):执行正在的数据通信 该命令将连接到远程主机,执行必要的命令,并接收数据,当接收到数据时,之前设定的函数就会被调用,libcurl接收和返回的数据大小不一,它会尽可能多的、及时的将数据传递给回调函数,回调函数返回接收的数据长度,如果回调函数返回的长度与传递给它的长度不一致,即返回长度!=size*nmemb libcurl将会终止 *** 作,并返回一个错误代码。 传递结束时,curl_easy_perform将返回一个代码表示 *** 作成功或失败,如果需要获取更多有关通信细节的信息,可以设置CURLOPT_ERRORBUFFER属性,让libcurl缓存更多可读的错误信息。
easy_handle在完成一次数据通信后可以被重用,也建议重用存在的easy_handle。
对于一些协议,下载文件可能包括许多复杂的子过程,日志记录、设置传输模式、选择当前文件夹,最后下载文件数据,使用libcurl则无需关心这些,只需一个URL。libcurl会完成所有工作。 一个简单的Demo如下:
    auto path = fileUtils::getInstance()->getWritablePath() + "data.HTML";    log("-------------path = %s",path.c_str());    CURLcode res;    CURL* curl_handle = curl_easy_init();    if(curl_handle)    {        file* fp = fopen(path.c_str(),"ab+");        char buf[128];        write_data(buf,1,128,fp);                curl_easy_setopt(curl_handle,CURLOPT_URL,"http://10.8.54.20:8080/showpageservice/queryThumbanillnfo.do");        curl_easy_setopt(curl_handle,CURLOPT_WRITEFUNCTION,write_data);        curl_easy_setopt(curl_handle,CURLOPT_WRITEDATA,fp);        res = curl_easy_perform(curl_handle);        curl_easy_cleanup(curl_handle);        fclose(fp);                if(res != CURLE_OK)        {            log("get data error");        }    }else{        log("Failed to init curl");    }

size_t write_data(voID *buffer,voID *user_p){    file* fp = (file*)user_p;    size_t return_size = fwrite(buffer,size,nmemb,fp);    log("接收到的数据:%s",buffer);    return return_size;}
如上,注意一点是:如果文件在上面代码中打开,就要在上面代码中 fclose关闭,如果在下面write_data中打开,则在下面fclose关闭,否则,libcurl会返回23的错误代码。
3、出现请求错误:可以将CURLOPT_VERBOSE属性设置为1,libcurl会输出通信过程中的一些细节,如果使用的http协议,请求头/响应头也会被输出,将CURLOPT_header设置为1,这些头信息将出现在消息的内容当中。
4、上传数据到远程站点:libcurl提供协议无关的方式进行数据传输,所以上传一个文件到FTP服务器,跟向http服务器提交一个PUT请求的 *** 作方式是类似的。 1)创建easy_handle或者重用先前创建的easy_handle 2)设置CURLOPT_URL属性 3)编写回调函数。在执行的上传的时候,libcurl通过回调函数读取要上传的数据。如果要从远程服务器下载数据,可以通过回调来保存接收到的数据,上传的回调函数原型如下: size_t function(char* bufptr,size_t nitems,voID* userp); 参数1:bufptr指针表示缓冲区,用于保存要上传的数据 参数2和3:size*nitems是缓冲区数据的长度 参数4:userp是一个用户自定义指针,libcurl不对该指针作任何 *** 作,它只是简单的传递该指针,可以使用该指针在应用程序与libcurl之间传递。 4)注册回调函数,设置自定义指针 注册回调函数:curl_easy_setopt(easy_handle,CURLOPT_READFUNCTION,read_function); 设置自定义指针:curl_easy_setopt(easy_handle,CURLOPT_READDATA,filedata); 5)告诉libcurl,执行的是上传 *** 作。 curl_easy_setopt(easy_handle,CURLOPT_UPLOAD,1L); 注意:有些协议在没有预先知道上传文件大小的情况下,可能无法正确判断上传是否结束,可以使用CURLOPT_INfileSIZE_LARGE属性,告诉它要上传文件的大小。 curl_easy_setopt(easy_handle,CURLOPT_INfileSIZE_LARGE,file_size); 6)调用curl_easy_perform:完成文件上传。libcurl会不断调用先前设置的回调函数,用于将要上传的数据读入到缓冲区,并执行上传。 总结

以上是内存溢出为你收集整理的Cocos2d-x中libcurl库的使用(2)curl_easy API的介绍全部内容,希望文章能够帮你解决Cocos2d-x中libcurl库的使用(2)curl_easy API的介绍所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1021132.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存