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使用的更多相关文章

  1. Sword libcurl回调函数相关知识

    libcurl响应回调函数说明   libcurl在默认情况下,回调里面会将数据分段的返回,不会一下子将发送端的数据全部塞到回调函数里面, 经过源码分析回调函数和curl_easy_perform是在 ...

  2. Sword libcurl库CURLE_COULDNT_CONNECT错误

    CURL: CURLE_COULDNT_CONNECT问题分析 测试环境描述在使用libcurl写http客户端进行压力测试的时候会遇到curl_easy_perform()返回CURLE_COULD ...

  3. (转)利用libcurl和国内著名的两个物联网云端通讯的例程, ubuntu和openwrt下调试成功(四)

    1. libcurl 的参考文档如下 CURLOPT_HEADERFUNCTION Pass a pointer to a function that matches the following pr ...

  4. (转)利用libcurl获取新浪股票接口, ubuntu和openwrt实验成功(三)

    1.  利用 CURLOPT_WRITEFUNCTION 设置回调函数, 利用 CURLOPT_WRITEDATA 获取数据指针 官网文档如下 CALLBACK OPTIONS CURLOPT_WRI ...

  5. 用libcurl 登录网站

    libcurl 可以发送和接收HTTP消息,因此可以发送用户名.密码和验证码来登录网站,网上有不少这方面的内容,但不甚完整,我摸索了两天,将其中要点记录下来. 基本步骤 正常访问登录页面,访问时,设置 ...

  6. libCURL开源库在VS2010环境下编译安装,配置详解

    libCURL开源库在VS2010环境下编译安装,配置详解 转自:http://my.oschina.net/u/1420791/blog/198247 http://blog.csdn.net/su ...

  7. 错误解决: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 ...

  8. 交叉编译总结 libosscore.a libcurl.a libmysqlclient.a

    把工程文件交叉编译到arm上运行,着实花费了一番功夫. 首先遇到的错误是 X uses VFP register arguments, B does not 百度了一下,发现是硬浮点和软浮点的问题,原 ...

  9. 安装zabbix报错configure: error: libcurl library not found

    libcurl 和libcurl-devel都已经安装 且大于7.13.1 但还是报错,这时需要在configure 指定curl路径即可 ./configure --prefix=/usr/loca ...

随机推荐

  1. MQ有啥用

    Q:最近看了一些MSMQ的资料,感觉很是奇怪,在IIS中装上此服务后,感觉这东西就像一个小数据库一样,暂时保存一些发送过来的数据,然后另一端再去收取?A:是的. Q:这样有什么用呢?直接在数据库中建立 ...

  2. Atitit 通用接口的设计与实现attilax 总结

    Atitit 通用接口的设计与实现attilax 总结 1.1. 现存的情况1 1.2. 接口返回类型,与返回序列化格式1 1.3. 异常传递 代替返回值模式1 1.4. 通用接口原理1 1.5. A ...

  3. 基于 Promise 的 HTTP 请求客户端 axios

    基于 Promise 的 HTTP 请求客户端,可同时在浏览器和 node.js 中使用 功能特性 在浏览器中发送 XMLHttpRequests 请求 在 node.js 中发送 http请求 支持 ...

  4. python geoip2使用

    使用geoip可以查询ip的详细地址信息,简单记录下使用方法(centos python2.7): 1.安装 yum -y install geoip geoip-devel pip install ...

  5. C#中int、long、float、double、decimal最大值最小值

    最近在将java上写的一个简单的表达式求值计算器移植到Windows Phone 8,java中double的精度问题是很明显的,解决办法是改用BigDecimal类.所以觉得C#中用double也是 ...

  6. FLINK 设计文档

    https://cwiki.apache.org/confluence/display/FLINK/Apache+Flink+Home https://cwiki.apache.org/conflue ...

  7. 关于angular的$resource中的isArray属性问题

    在之前的文章中讲到了在使用$resource的时候,有一个isArray属性. 这个属性在两个地方有提到: 1. angular学习笔记(二十八)-$http(6)-使用ngResource模块构建R ...

  8. [Windows Azure] About Affinity Groups for Virtual Network

    Affinity groups are the way to group the services in your Windows Azure subscription that need to wo ...

  9. 使用 libvirt创建和管理KVM虚拟机

      1. libvirt介绍    Libvirt是一个软件集合,便于使用者管理虚拟机和其他虚拟化功能,比如存储和网络接口管理等等.Libvirt概括起来包括一个API库.一个 daemon(libv ...

  10. 基于jquery鼠标点击图片翻开切换效果

    基于jquery鼠标点击图片翻开切换效果是一款基于jQuery+CSS3实现的点击图片切换特效.效果图如下: 在线预览   源码下载 实现的代码. html代码: <div class=&quo ...