使用libcurl作为Http client
产品通过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的更多相关文章
- libcurl 使用的几个注意事项
注:libcurl 入门指南( the tutorial ): http://curl.haxx.se/libcurl/c/libcurl-tutorial.html 0. 为使用的curl url ...
- Libcurl的编译_HTTP/HTTPSclient源代码演示样例
HTTP/HTTPSclient源代码演示样例 环境: zlib-1.2.8 openssl-1.0.1g curl-7.36 Author: Kagula LastUpdateDate: 2 ...
- 【转载】HTTP/FTP客户端开发库:libwww、libcurl、libfetch
网页抓取和ftp访问是目前很常见的一个应用需要,无论是搜索引擎的爬虫,分析程序,资源获取程序,WebService等等都是需 要的,自己开发抓取库当然是最好了,不过开发需要时间和周期,使用现有的Ope ...
- 好用的http client库CPP REST SDK
前言 C++中http client库本身就少,好用的就更少了,在了解微软开源的CPP REST SDK库之前,我知道的C++ http client库有libcurl(这个是C语言的),Qt的QNe ...
- About libcurl and cURL in PHP
今天在学习php时遇到要调用curl 库函数对特定url字符串进行访问操作,需要自己写一个方法进行调用,之前在linux系统中也有用到cURL 命令行工具执行对相关资源的获取,在wiki上找到了如下的 ...
- [译]libcurl错误码
CURLcode Almost all "easy" interface functions return a CURLcode error code. No matter wha ...
- 【C/S通信交互之Http篇】Cocos2dx(Client)使用Curl与Jetty(Server)实现手机网游Http通信框架(内含解决curl.h头文件找不到问题)
之前已经分享过一篇基于Cocos2dx与服务器使用Socket进行通信的框架,还不太熟悉的请移步到如下博文中: [C/S通信交互之Socket篇]Cocos2dx(Client)使用BSD Socke ...
- vmware里面的名词 vSphere、vCenter Server、ESXI、vSphere Client
vmware里面的名词 vSphere.vCenter Server.ESXI.vSphere Client vSphere.vCenter Server.ESXI.vSphere Client VS ...
- Apache2.4:AH01630 client denied by server configuration
问题说明:Apache服务总共有4个,是为了防止单点故障和负载均衡,负载均衡控制由局方的F5提供. 访问的内容在NAS存储上,现象是直接访问每个apache的服务内容都是没有问题,但是从负载地址过来的 ...
随机推荐
- 安天透过北美DDoS事件解读IoT设备安全——Mirai的主要感染对象是linux物联网设备,包括:路由器、网络摄像头、DVR设备,入侵主要通过telnet端口进行流行密码档暴力破解,或默认密码登陆,下载DDoS功能的bot,运行控制物联网设备
安天透过北美DDoS事件解读IoT设备安全 安天安全研究与应急处理中心(安天CERT)在北京时间10月22日下午启动高等级分析流程,针对美国东海岸DNS服务商Dyn遭遇DDoS攻击事件进行了跟进分析. ...
- kali-rolling安装openvas 9并创建扫描任务教程
一. 前置说明 官方:漏洞扫描中最常用和强大的是某个”N“开头的漏洞扫描器(nessus),但由于许可证限制,kali中并未安装该漏洞扫描器.取而代之安装了nessus收费之后发起的开源版本openv ...
- sudo配置教程
一.相关说明 1.sudo配置文件是/etc/sudoers:另外会自动包含/etc/sudoers.d目录下的文件(/etc/sudoers文件最后有一句“#includedir /etc/sudo ...
- WebSphere隐藏版本号教程
一.实施步骤 1.登陆WAS控制台,进入服务器列表界面. 2.选择一个server进到server配置页面. 3.选择进入“Web容器传输链”页面. 针对这4项都进行以下第4和第5步操作,以下以WCI ...
- vsftpd更新和修改版本号教程
1.rpm包更新 类似以下更新即可 rpm -Uvh vsftpd--.el6.x86_64.rpm 2.源码更新 不懂为什么对于新版本可能只有源码包而没有rpm等包,如此只能以源码更新了. .tar ...
- 加号变空格问题 url参数 post get 请求发送
问题:加号后台接收变空格问题 结论: 1.任何get拼接的请求 参数key value 需要编码后在拼接 2.get请求避免做数据提交,用post提交.jq,axios的post提交默认编码了不会有问 ...
- Linux gcc getcwd()的实现 zhuan
通过getcwd()可以获取当前工作目录. 1 #include <unistd.h> 2 3 char *getcwd(char *cwdbuf, size_t size);
- Win10系列:UWP界面布局基础11
样式继承 为了使样式便于维护及重复使用,可以在一个样式上引用其他的样式,这就是样式继承.样式继承的方法是:在Style元素的BasedOn属性上使用StaticResource标记扩展来引用被继承的样 ...
- learning ddr DLL-off mode
- Java判断对象是否为NULL
Java使用反射判断对象是否为NULL 判断Java对象是否为null可以有两层含义: 第一层: 直接使用 object == null 去判断,对象为null的时候返回true,不为null的时候 ...