产品通过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. Linux使用ntpdate和ntpd进行时间同步

    生产环境关联主机间常要求时间一致,若有NTP时间同步服务器,可配置各主机与时间同步服务器同步时间. 1.使用ntpdate进行时间同步 安装ntp客户端: yum install ntpdate 同步 ...

  2. Java数组,导入包,foreach控制循环

    总见流星过,火花转瞬逝.何时见春雨,润物细无声. 导入包,例使用Scanner工具类,需要导入包: import  java.util.Scanner; ************ ********** ...

  3. office install problems

    regedit 0000 "00005"或"00002"开头的项 remove all regedit options

  4. PhpStudy的安装及使用教程

    1.PhpStudy是什么 phpstudy是一个PHP调试环境的程序集成包,phpStudy软件集成了最新的Apache.PHP.MySQL.phpMyAdmin.ZendOptimizer,一次性 ...

  5. CAD绘制室外平台步骤5.3

    1.在平面上用直线划出台阶范围. “工具”“曲线工具”“线变复线”选择这几条线,它们就变成了一条线. “三维建模”“造型对象”“平板”选择这条封闭的线,回车,选择相邻门窗柱子等,回车输入平台厚度如“- ...

  6. Spring框架的四大原则

    Spring框架本身有四大原则: 1).使用POJO进行轻量级和最小入侵式开发 2).通过以来注入和基于接口编程实现松耦合 3).通过AOP和默认习惯进行声明式编程 4).使用AOP和模板减少模式化代 ...

  7. Python返回值不同格式的取值方式

    例: { "success": true, "topic_id": "5c89021773798770589936b0"} 转换成text, ...

  8. SQL-28 查找描述信息中包括robot的电影对应的分类名称以及电影数目,而且还需要该分类对应电影数量>=5部

    题目描述 film表 字段 说明 film_id 电影id title 电影名称 description 电影描述信息 CREATE TABLE IF NOT EXISTS film ( film_i ...

  9. IDEA中不同项目配置不同JDK

    安装JDK后,选择其中一个配置环境变量,在IDEA中可以给不同项目选择不同的JDK版本.如下图两个项目:

  10. PropertiesUtil 读取properties

    package com.midea.clean.util; import java.io.InputStream; import java.io.UnsupportedEncodingExceptio ...