Sword libcurl使用
libcurl编译
>> ./configure --prefix=/opt/soft/curl --disable-ldap --disable-ldaps
>> make
>> make install
注意点:如果使用libcurl.a静态库,那么在链接是需要增加-lrt -lcrypto -lssl -lpthread -lz这几个动态库
#include <iostream>
#include <stdlib.h>
#include <string.h> #include "curl/curl.h" using namespace std; //该结构体完全可以自定义,只需要在回调函数中注意使用
struct MemoryStruct {
char *memory;
size_t size;
}; //请求结果后的回调函数
static size_t callback(void *contents, size_t size, size_t nmemb, void *userp)
{
size_t realsize = size * nmemb;
//内存分配可以自由控制
struct MemoryStruct *mem = (struct MemoryStruct *)userp; mem->memory = (char *)realloc(mem->memory, mem->size + realsize + );
if (mem->memory == NULL) {
/* out of memory! */
printf("not enough memory (realloc returned NULL)\n");
return ;
} memcpy(&(mem->memory[mem->size]), contents, realsize);
mem->size += realsize;
mem->memory[mem->size] = ; return realsize;
} //get方式访问
int url_get()
{
//easy handler句柄
CURL *curl_handle; //easy 错误码
CURLcode res;
struct MemoryStruct chunk; //HTTP报文头
struct curl_slist* headers = NULL; /*
这里是否分配内存,完全取决于CURLOPT_WRITEFUNCTION选项中的回调函数需要怎样分配内存,可以自由发挥
*/
chunk.memory = (char *)malloc();
chunk.size = ; /*
这个函数只能用一次,如果这个函数在curl_easy_init函数调用时还没调用,
它讲由libcurl库自动调用,所以多线程下最好在主线程中调用一次该函数以防止在线程
中curl_easy_init时多次调用
*/
res = curl_global_init(CURL_GLOBAL_ALL);
if (CURLE_OK != res)
{
//初始化失败
return -;
} //初始化easy handler句柄
curl_handle = curl_easy_init();
if (NULL == curl_handle)
{
//easy handler句柄初始化失败
return -;
} //构建HTTP报文头--可以填写多个报文头
headers = curl_slist_append(headers,"Accept-Charset:utf-8");
headers = curl_slist_append(headers,"Accept-Language: en-US");
//设置HTTP报文头
curl_easy_setopt(curl_handle, CURLOPT_HTTPHEADER, headers); //请求超时时长
curl_easy_setopt(curl_handle, CURLOPT_TIMEOUT, 3L); //连接超时时长
curl_easy_setopt(curl_handle, CURLOPT_CONNECTTIMEOUT, 10L); //允许重定向
curl_easy_setopt(curl_handle, CURLOPT_FOLLOWLOCATION, 1L); //设置为非0将响应头信息同响应体一起传给WRITEFUNCTION
curl_easy_setopt(curl_handle, CURLOPT_HEADER, 0L); //得到请求结果后的回调函数
curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, callback); //获取请求结果
//特别注意:CURLOPT_WRITEDATA必须和CURLOPT_WRITEFUNCTION一起使用,
//因为chunk就是CURLOPT_WRITEFUNCTION的第四个参数
curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, &chunk); //设置需要访问的url地址
//注意:必选项,不可缺少
curl_easy_setopt(curl_handle, CURLOPT_URL, "https://www.baidu.com/?tn=98010089_dg"); //执行请求
res = curl_easy_perform(curl_handle); //获取HTTP返回码
long res_code = ;
res = curl_easy_getinfo(curl_handle, CURLINFO_RESPONSE_CODE, &res_code); if (!(res == CURLE_OK && ( == res_code || == res_code)))
{
//执行请求失败--也可以不判断HTTP返回码
return -;
} //将下载下来的数据存在本地
FILE *pfw = fopen("1.html", "w");
fwrite(chunk.memory, chunk.size, , pfw);
fclose(pfw); //清理HTTP报文头
curl_slist_free_all(headers); //清理easy handler句柄
curl_easy_cleanup(curl_handle); //清理全局变量
curl_global_cleanup(); return ;
} //post方式访问
int url_post()
{
CURL *curl_handle; CURLcode res;
struct MemoryStruct chunk; chunk.memory = (char *)malloc();
chunk.size = ; res = curl_global_init(CURL_GLOBAL_ALL);
if (CURLE_OK != res)
{
return -;
}
curl_handle = curl_easy_init();
if (NULL == curl_handle)
{
return -;
} //post参数之间使用 & 分隔
char *post_arg = (char *)"user_id=speech&domain=1&language=zh&speed=5&text=标贝语音,为您服务"; //设置post参数
curl_easy_setopt(curl_handle, CURLOPT_POSTFIELDS, post_arg); // 设置为非0表示本次操作为POST
curl_easy_setopt(curl_handle, CURLOPT_POST, ); //得到请求结果后的回调函数
curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, callback); curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, &chunk); curl_easy_setopt(curl_handle, CURLOPT_URL, "http://xxx/tts"); //执行请求
res = curl_easy_perform(curl_handle); //获取HTTP返回码
long res_code = ;
res = curl_easy_getinfo(curl_handle, CURLINFO_RESPONSE_CODE, &res_code); if (!(res == CURLE_OK && ( == res_code || == res_code)))
{
//执行请求失败--也可以不判断HTTP返回码
return -;
} FILE *pfw = fopen("1.mp3", "w");
fwrite(chunk.memory, chunk.size, , pfw);
fclose(pfw); curl_easy_cleanup(curl_handle);
curl_global_cleanup(); return ; } int main()
{
url_post();
return ;
}
//当url中有特殊字符时,例如空格等,需要使用curl_easy_escape转码
CURL *curl = curl_easy_init();
if(curl) {
char *output = curl_easy_escape(curl, "data to convert", );
if(output) {
printf("Encoded: %s\n", output);
curl_free(output);
}
}
//注意需要调用curl_free()函数释放返回值
liburl动态需要依赖ssl库文件libcrypto.so libssl.so
Sword libcurl使用的更多相关文章
- Sword libcurl回调函数相关知识
libcurl响应回调函数说明 libcurl在默认情况下,回调里面会将数据分段的返回,不会一下子将发送端的数据全部塞到回调函数里面, 经过源码分析回调函数和curl_easy_perform是在 ...
- Sword libcurl库CURLE_COULDNT_CONNECT错误
CURL: CURLE_COULDNT_CONNECT问题分析 测试环境描述在使用libcurl写http客户端进行压力测试的时候会遇到curl_easy_perform()返回CURLE_COULD ...
- (转)利用libcurl和国内著名的两个物联网云端通讯的例程, ubuntu和openwrt下调试成功(四)
1. libcurl 的参考文档如下 CURLOPT_HEADERFUNCTION Pass a pointer to a function that matches the following pr ...
- (转)利用libcurl获取新浪股票接口, ubuntu和openwrt实验成功(三)
1. 利用 CURLOPT_WRITEFUNCTION 设置回调函数, 利用 CURLOPT_WRITEDATA 获取数据指针 官网文档如下 CALLBACK OPTIONS CURLOPT_WRI ...
- 用libcurl 登录网站
libcurl 可以发送和接收HTTP消息,因此可以发送用户名.密码和验证码来登录网站,网上有不少这方面的内容,但不甚完整,我摸索了两天,将其中要点记录下来. 基本步骤 正常访问登录页面,访问时,设置 ...
- libCURL开源库在VS2010环境下编译安装,配置详解
libCURL开源库在VS2010环境下编译安装,配置详解 转自:http://my.oschina.net/u/1420791/blog/198247 http://blog.csdn.net/su ...
- 错误解决:error while loading shared libraries: libcurl.so.4: cannot open shared object file: No such file or directory
执行以下代码,生成唯一的UID $fp = popen("/xxx/bin/tools/uuidgen system", "r");// $uid = frea ...
- 交叉编译总结 libosscore.a libcurl.a libmysqlclient.a
把工程文件交叉编译到arm上运行,着实花费了一番功夫. 首先遇到的错误是 X uses VFP register arguments, B does not 百度了一下,发现是硬浮点和软浮点的问题,原 ...
- 安装zabbix报错configure: error: libcurl library not found
libcurl 和libcurl-devel都已经安装 且大于7.13.1 但还是报错,这时需要在configure 指定curl路径即可 ./configure --prefix=/usr/loca ...
随机推荐
- 设计模式-建造者模式(Builder Pattern)
建造者模式(Builder Pattern):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 建造者模式要求建造过程中是稳定的. Android 用到的 Builder 模 ...
- 如何在JS数组特定索引处指定位置插入元素?
如何在JS数组特定索引处指定位置插入元素? 需求: 将一个元素插入到现有数组的特定索引处.听起来很容易和常见,但需要一点时间来研究它. // 原来的数组var array = ["one&q ...
- 【Unity】12.3 Off Mesh Link组件
开发环境:Win10.Unity5.3.4.C#.VS2015 创建日期:2016-05-09 一.简介 Off Mesh Link组件用于手动指定路线来生成分离的网格连接.例如,游戏中让行进对象上下 ...
- 如何从angular2中的url获取查询参数?
问题描述 我使用angular2.0.0-beta.7.当组件在像”/path?query=value1″这样的路径上加载时,它被重定向到”/path”.为什么删除了GET参数?如何保留参数? 路由器 ...
- python __name__ = '__main__' 的作用
很多新手刚开始学习python的时候经常会看到python 中__name__ = \'__main__\' 这样的代码,可能很多新手一开始学习的时候都比较疑惑,python 中__name__ = ...
- 每日英语:The Toy Mogul Who Became A Billionaire Through His Fight To The Death With Barbie
The trophy case in the tiny conference room outside Isaac Larian’s corner office spans an entire wal ...
- python(59):yield 函数
可迭代对象: 当你建立了一个列表,你可以逐项地读取这个列表,这叫做一个可迭代对象: >>> mylist = [1, 2, 3] >>> for i in myli ...
- quick3.3final版创建项目报错解决
PHP Notice: Undefined index: QUICK_V3_ROOT in 405,469,497,520,551这5行代码都访问了一个环境变量$_ENV['QUICK_V3_ROO ...
- Python学习笔记(4):容器、迭代对象、迭代器、生成器、生成器表达式
在了解Python的数据结构时,容器(container).可迭代对象(iterable).迭代器(iterator).生成器(generator).列表/集合/字典推导式(list,set,dict ...
- HTTP请求与响应报文详解
如图所示,这是客户端往服务器发送请求时的报文: 一般来说,将报文分成三个部分,请求行.请求头.请求体 如图,请求行包括三部分内容 1.请求方法,在HTTP里的请求方法种类较多,但就移动端开发来说,常用 ...