产品通过HTTP协议为外部提供接口服务,常规情况是客户通过HTTP协议请求服务,服务结束后通过HTTP协议将服务记录POST到请求方。

用原生C实现了一个简单的HTTP Client,只有简单的功能:

1、实现HTTP GET/POST/PUT等方法;

2、POST支持参数和数据POST;

3、POST后接收返回值并关闭连接;

4、支持连接TIMEOUT、同步接收返回值TIMEOUT;

5、由于要设置超时,采用了多线程POST数据;

在业务量大了后,会频繁调用HTTP Client,且本身是多线程POST数据,出现了内存异常,问题一直没有找到。因此考虑了第三方开源组件,比如libevent(HTTP Server采用libevent实现的)、libcurl,最终选择了libcurl。

以下是结合网上例子修改的测试版本,测试后发现有内存泄漏问题,是由于自定义的http header指针未释放导致,并非网上所说curl_easy_perform导致。

#include <stdio.h>
#include <curl/curl.h>
#define PROC_SUCCESS 0
#define PROC_FAILED -1 static long gCount = 0; int main()
{
time_t begin = time(NULL);
curl_global_init(CURL_GLOBAL_DEFAULT);
while(1)
{
const char *xml="<?xml />";
CurlPost("http://10.0.0.1:8090/xdr",xml);
gCount++;
if(gCount%10000==0)
{
time_t now = time(NULL);
fprintf(stdout,"CurlPost %ld usetime:%d\n",gCount,now-begin);
begin = now;
}
usleep(10000);
}
curl_global_cleanup();
} int CurlPost(const char *uri,const char *xml)
{
int iRet = PROC_SUCCESS;
CURL *curl = curl_easy_init();
if(curl==NULL)
{
fprintf(stderr,"curl_easy_init err:%ld\n",gCount);
iRet = PROC_FAILED;
return iRet;
}
struct curl_slist *http_header = NULL;
http_header = curl_slist_append(http_header, "Accept: *");
http_header = curl_slist_append(http_header, "Content-Type: application/xml");
http_header = curl_slist_append(http_header, "Charset: utf-8");
http_header = curl_slist_append(http_header, "User-Agent: HYB-HTTPCLI"); curl_easy_setopt(curl,CURLOPT_URL,uri);
curl_easy_setopt(curl,CURLOPT_POSTFIELDS,xml);
curl_easy_setopt(curl,CURLOPT_POST,1);
curl_easy_setopt(curl,CURLOPT_HTTPHEADER, http_header);//设置HTTP HEADER
curl_easy_setopt(curl,CURLOPT_FOLLOWLOCATION,1);
curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1L); //禁止产生信号(多线程时设置此选项)
curl_easy_setopt(curl,CURLOPT_TIMEOUT,1L); //超时1s
curl_easy_setopt(curl, CURLOPT_FORBID_REUSE, 1); //完成后强制关闭连接
CURLcode res = curl_easy_perform(curl);
if (res != CURLE_OK)
{
fprintf(stderr,"CurlPost err:%s\n",curl_easy_strerror(res));
iRet = PROC_FAILED;
}
curl_slist_free_all(http_header);//http_header需要释放
curl_easy_cleanup(curl);
return iRet;
}

CURLOPT_POSTFIELDS选项的使用:

如果是POST参数,填写参数即可,libcurl会将参数自动放到请求行中,比如:

aa=12&bb=34

使用libcurl作为Http client的更多相关文章

  1. libcurl 使用的几个注意事项

    注:libcurl 入门指南( the tutorial ): http://curl.haxx.se/libcurl/c/libcurl-tutorial.html 0. 为使用的curl url ...

  2. Libcurl的编译_HTTP/HTTPSclient源代码演示样例

    HTTP/HTTPSclient源代码演示样例 环境:  zlib-1.2.8  openssl-1.0.1g  curl-7.36 Author:  Kagula LastUpdateDate: 2 ...

  3. 【转载】HTTP/FTP客户端开发库:libwww、libcurl、libfetch

    网页抓取和ftp访问是目前很常见的一个应用需要,无论是搜索引擎的爬虫,分析程序,资源获取程序,WebService等等都是需 要的,自己开发抓取库当然是最好了,不过开发需要时间和周期,使用现有的Ope ...

  4. 好用的http client库CPP REST SDK

    前言 C++中http client库本身就少,好用的就更少了,在了解微软开源的CPP REST SDK库之前,我知道的C++ http client库有libcurl(这个是C语言的),Qt的QNe ...

  5. About libcurl and cURL in PHP

    今天在学习php时遇到要调用curl 库函数对特定url字符串进行访问操作,需要自己写一个方法进行调用,之前在linux系统中也有用到cURL 命令行工具执行对相关资源的获取,在wiki上找到了如下的 ...

  6. [译]libcurl错误码

    CURLcode Almost all "easy" interface functions return a CURLcode error code. No matter wha ...

  7. 【C/S通信交互之Http篇】Cocos2dx(Client)使用Curl与Jetty(Server)实现手机网游Http通信框架(内含解决curl.h头文件找不到问题)

    之前已经分享过一篇基于Cocos2dx与服务器使用Socket进行通信的框架,还不太熟悉的请移步到如下博文中: [C/S通信交互之Socket篇]Cocos2dx(Client)使用BSD Socke ...

  8. vmware里面的名词 vSphere、vCenter Server、ESXI、vSphere Client

    vmware里面的名词 vSphere.vCenter Server.ESXI.vSphere Client vSphere.vCenter Server.ESXI.vSphere Client VS ...

  9. Apache2.4:AH01630 client denied by server configuration

    问题说明:Apache服务总共有4个,是为了防止单点故障和负载均衡,负载均衡控制由局方的F5提供. 访问的内容在NAS存储上,现象是直接访问每个apache的服务内容都是没有问题,但是从负载地址过来的 ...

随机推荐

  1. 【转】[总结]vue开发常见知识点及问题资料整理(持续更新)

    1.(webpack)vue-cli构建的项目如何设置每个页面的title 2.vue项目中使用axios上传图片等文件 3.qs.stringify() 和JSON.stringify()的区别以及 ...

  2. Linux Shell数值比较和字符串比较及相关

    说明: 1. 把字符串当成整型进行比较,由于abcd等字符对不上0123当程序尝试去转成二进制时无法完成转换,所以用于数值比较的运算不能用于字符串比较:但是把整型当成字符串进行比较,0123这些数值完 ...

  3. Flexbox 布局的最简单表单 (转)

    作者: 阮一峰 弹性布局(Flexbox)逐渐流行,越来越多人使用,因为它写 CSS 布局真是太方便了. 三年前,我写过 Flexbox 的介绍(上,下),但是有些地方写得不清楚.今天,我看到一篇教程 ...

  4. 最新jquery+easyui_api培训文档

    目  录 1 Accordion(可折叠标签) 2 1.1 实例 2 1.2 参数 3 2 DateBox(日期框) 4 2.1 实例 4 2.2 参数 6 2.3 事件 6 2.4 方法 6 3 C ...

  5. ES6中的Promise.resolve()的作用

    var foo = { then: (resolve, reject) => resolve('foo') }; var resolved = Promise.resolve(foo); 相当于 ...

  6. javascript 数组函数

    声明数组 var tmp=[];//简写模式 var tmp= new Array();//直接new一个 var tmp=array(); //直接new一个 在new数组的时候可以传入一个参数,表 ...

  7. caffe的一些概念理解

    有一天,师姐问我,epoch和iteration有什么区别?我一时语塞,竟然遍寻百度而不得,最后在stackoverflow上找到一个我认为比较靠谱的答案,虽然它不是最高票,但是是最好理解的,深得我心 ...

  8. Java 安装后的检测是否安装成功

    下载安装JDK(Java SE development Kit) Java是有sun公司发行的编程语言,JDK的官方下载地址为:http\\ java.sun.com 昨天选择下载的是jdk-8u10 ...

  9. 一步一步开始FPGA逻辑设计 - 高速接口之PCIe(转)

    reference: https://blog.csdn.net/jackxu8/article/details/53288385 这篇文章主要针对Xilinx家V6和K7两个系列的PFGA,在Lin ...

  10. python笔记3-输出输入、字符串格式化

    输入.输出 python怎么来接收用户输入呢,使用input函数,python2中使用raw_input,接收的是一个字符串,输出呢,第一个程序已经写的使用print,代码入下: 1 2 name=i ...