前言

  libevent和libcurl都是功能强大的开源库;libevent主要实现服务器,包含了select、epoll等高并发的实现;libcurl实现了curl命令的API封装,主要作为客户端。这两个开源库的安装可以参考我的这篇博客:https://www.cnblogs.com/liudw-0215/p/9917422.html,并且我的代码都提交在了我的github上了,可以点左上角图标,跳转到github,仓库是libcurl。

  一、curl的两种使用方法

  1、命令行模式

    所谓命令行模式,就是直接linux的命令行直接可以执行的curl命令,curl可以做很多事情,我主要介绍作为客户端发送xml和json数据,因为命令行模式非常要注意格式问题!

  (1)发送xml格式数据

  格式如下:

  

echo '<?xml version="1.0" encoding="UTF-8"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:itsm="http://itsm.soa.csg.cn/"><soapenv:Header xmlns:auth="http://itsm.soa.csg.cn/"><auth:user>local_admin</auth:user><auth:password>local_admin</auth:password></soapenv:Header><soapenv:Body><itsm:accountOper><operType>1</operType><operItems><operItem><deviceName>测试虚拟机181106</deviceName><deviceIP>11.11.22.23</deviceIP><protocol>设备帐户</protocol><accountName>administrator</accountName></operItem></operItems></itsm:accountOper></soapenv:Body></soapenv:Envelope>'|curl -X POST -H 'Content-type:text/xml' -d @- http://10.94.1.167:80/ITSMWebServer/itsm

  说明:

  • echo后面跟的是xml格式数据,格式一般都是跟第三方平台约定好的,不能发这种格式,接收又是另一种格式,那没法解析了,都要提前约定好的!
  • 中间是“|”管道符,将echo的输出作为curl的输入
  • POST 说明是post请求
  • -H 携带的消息头
  • 最后的url,是要发送的地址

  (2)发送json格式数据

  格式如下:

  

curl -H "Content-Type:application/json" -H "appName:spvas" -H "password:123123" -H "pswdHashType:SHA1" -X POST  -k -g -d '{"param":[{"objectID":112,"type":1,"operate":1,"operatorID":100,"result":0,"time":1539941168,"policytype":0}]}' http://172.16.1.21:9999/rest/spvas/objChange.do

  说明:

  •   -H 依然是消息头
  • -d  后面是json格式的数据了

  2、libcurl库使用

  1、安装

  想要使用libcurl库,首先需要先安装,安装参考我的这篇博客写的很详细:https://www.cnblogs.com/liudw-0215/p/9917422.html

  2、使用libcurl的API

  主要就是调用libcurl库的API接口,下面介绍的http的POST请求,libcurl很多接口,不能一一介绍,需要时可以再去查找。

  (1)初始化curl句柄

CURL* curl = NULL;
curl = curl_easy_init();

    (2)设置curl的url

curl_easy_setopt(curl, CURLOPT_URL, "http://172.16.1.96:7777/login");

  (3)开启post请求开关

curl_easy_setopt(curl, CURLOPT_POST, true);

  (4)添加post数据

 curl_easy_setopt(curl, CURLOPT_POSTFIELDS, post_str);

  (5)设定一个处理服务器响应的回调函数

curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, deal_response);

  (6)给回调函数传递一个形参

curl_easy_setopt(curl, CURLOPT_WRITEDATA, &responseData);

  (7)向服务器发送请求,等待服务器的响应

res = curl_easy_perform(curl);

  3、总体代码

 客户端总体代码如下:

  

 View Code

  这是客户端的总体代码,但是还无法测试,因为没有服务端,下面会介绍用libevent库来搭建http的服务端;因为数据格式是json,所以用到了cJSON,可以到我的github上进行下载,编译命令:g++ login.cpp cJSON.cpp -o login -lcurl

  二、libevent库

 1、安装

    libevent依然是开源库,使用之前依然需要安装,安装参考我的这篇博客写的很详细:https://www.cnblogs.com/liudw-0215/p/9917422.html

  2、搭建http服务器

    安装之后,就可以使用了,主要都是调用libcurl库的API函数,main函数如下:

int main(int argc, char *argv[]) {//自定义信号处理函数signal(SIGHUP, signal_handler);signal(SIGTERM, signal_handler);signal(SIGINT, signal_handler);signal(SIGQUIT, signal_handler);//默认参数char *httpd_option_listen = "0.0.0.0";int httpd_option_port = 7777;int httpd_option_daemon = 0;int httpd_option_timeout = 120; //in seconds//获取参数int c;while ((c = getopt(argc, argv, "l:p:dt:h")) != -1) {switch (c) {case 'l' :httpd_option_listen = optarg;break;case 'p' :httpd_option_port = atoi(optarg);break;case 'd' :httpd_option_daemon = 1;break;case 't' :httpd_option_timeout = atoi(optarg);break;case 'h' :default :show_help();exit(EXIT_SUCCESS);}}//判断是否设置了-d,以daemon运行if (httpd_option_daemon) {pid_t pid;pid = fork();if (pid < 0) {perror("fork failed");exit(EXIT_FAILURE);}if (pid > 0) {//生成子进程成功,退出父进程exit(EXIT_SUCCESS);}}/* 使用libevent创建HTTP Server *///初始化event APIevent_init();//创建一个http serverstruct evhttp *httpd;httpd = evhttp_start(httpd_option_listen, httpd_option_port);evhttp_set_timeout(httpd, httpd_option_timeout);//也可以为特定的URI指定callbackevhttp_set_cb(httpd, "/", httpd_handler, NULL);evhttp_set_cb(httpd, "/login", login_handler, NULL);//循环处理eventsevent_dispatch();evhttp_free(httpd);return 0;
}

   3、测试http服务

  •   启动服务端  

  从我的github上下载之后,http服务在libcurl/http_server/这个目录,写Makefile,然后直接make就可以了,如下:

  

  make之后生成了server,执行:./server,启动服务

  •   启动客户端

  在libcurl/login/这个目录,执行:g++ login.cpp cJSON.cpp -o login -lcurl,进行编译,生成login,启动客户端:./login,客户端运行结果,如下:

  

  服务端响应结果,如下:

  

  至此,完成了演示,用libcurl和libevent搭建的http服务器与客户端,没有问题。是不是觉得到此就结束了,才没有呢?下面,将要介绍https服务器,那为什么要用https服务器呢?跟随我找到谜底吧!

  4、搭建https服务器

  (1)https介绍

  http传输过程都是明文传输,很不安全;就产生https,进行加密传输,但加密过程并没有那么简单,如下图所示:

  

  说明:

  主要经历了两个阶段:

  •   非对称加密过程

  通过公钥、私钥和CA证书,进行验证,最终获得会话密钥

  •   对称加密过程

  可能会想?直接都用非对称加密得了,为啥用对称加密?因为非对称效率很低,所以要用对称加密!

  用非对称过程得到的密钥,对数据进行加密然后传输。

  (2)https服务器实现

  libevent库应该从2.1版本之后才支持https的,所以在2.1之前的版本还要单独安装openssl!

  mian函数如下:

  

int main (int argc, char **argv)
{ /*OpenSSL 初始化 */common_setup ();              if (argc > 1) {char *end_ptr;long lp = strtol(argv[1], &end_ptr, 0);if (*end_ptr) {fprintf(stderr, "Invalid integer\n");return -1;}if (lp <= 0) {fprintf(stderr, "Port must be positive\n");return -1;}if (lp >= USHRT_MAX) {fprintf(stderr, "Port must fit 16-bit range\n");return -1;}serverPort = (unsigned short)lp;}/* now run http server (never returns) */return serve_some_http ();
}

  (3)测试https服务器

  •   启动服务端  

  从我的github上下载之后,http服务在libcurl/https_server/这个目录,写Makefile,然后直接make就可以了;

  •   启动客户端

  修改http的客户端就可以了,如下:

  

curl_easy_setopt(curl, CURLOPT_URL, "https://172.16.1.96:8080/login");//客户端忽略CA证书认证 用于https跳过证书认证
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, false);
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, false);

  说明:

  在http后面加上“s”;再加上跳过证书认证,就可以了

  

  

  

  

作者:逆袭之路

出处:https://www.cnblogs.com/liudw-0215/

-------------------------------------------

个性签名:独学而无友,则孤陋而寡闻。做一个灵魂有趣的人!

如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!

万水千山总是情,打赏一分行不行,所以如果你心情还比较高兴,也是可以扫码打赏博主,哈哈哈(っ•̀ω•́)っ✎⁾⁾!

libevent和libcurl实现http和https服务器 cJSON使用相关推荐

  1. 微信支付HTTPS服务器证书验证(PHP)

    PHP代码验证是否包含CA证书 如果无法通过验证,请点击连接查看官方操作,安装相应的ca证书即可 # test_wechat_ca.php <?php $data = array('mch_id ...

  2. nginx 学习笔记(9) 配置HTTPS服务器--转载

    HTTPS服务器优化 SSL证书链 合并HTTP/HTTPS主机 基于名字的HTTPS主机 带有多个主机名的SSL证书 主机名指示 兼容性 配置HTTPS主机,必须在server配置块中打开SSL协议 ...

  3. Nodejs 搭建https服务器(一)

    2019独角兽企业重金招聘Python工程师标准>>> 1. 搭建https服务器---前奏 首先需要理解几个概念 1. HTTP是一个网络协议,是专门用来传输 Web 内容; 2. ...

  4. android 访问https服务器

    之前,我讲了如何让tomcat支持https访问,当时浏览器通过https:localhost:8443即可访问tomcat.可是android此时如何访问已经搭建好的tomcat的https了?我在 ...

  5. spark在服务器运行示例_创建示例HTTPS服务器以获取乐趣和收益

    spark在服务器运行示例 通常,在开发或/和针对真实场景进行测试期间,我们(开发人员)面临着运行成熟的HTTPS服务器的需求,可能同时进行一些模拟. 在JVM平台上,除非您知道适合此工作的正确工具, ...

  6. 创建示例HTTPS服务器以获取乐趣和收益

    通常,在开发人员或/和针对实际场景进行测试期间,我们(开发人员)面临着运行成熟的HTTPS服务器的需求,可能同时进行一些模拟. 在JVM平台上,除非您知道适合此工作的正确工具,否则它过去并不是一件容易 ...

  7. 使用nginx搭建https服务器

    最近在研究nginx,整好遇到一个需求就是希望服务器与客户端之间传输内容是加密的,防止中间监听泄露信息,但是去证书服务商那边申请证书又不合算,因为访问服务器的都是内部人士,所以自己给自己颁发证书,忽略 ...

  8. VC++访问HTTPS服务器(不受限制)

    之前用VC客户端访问HTTPS服务器时,遇到"认证作者无效或者不正确","证书已失效"及类似的问题相当棘手,在这里我把可以忽略这些认证的方法写出来,让遇到相同问 ...

  9. NGINX SSL配置之设置HTTPS服务器

    NGINX SSL配置 本节介绍如何在NGINX和NGINX Plus上配置HTTPS服务器. 设置HTTPS服务器 要设置HTTPS服务器,请在您的nginx.conf文件中的块中ssl将该list ...

最新文章

  1. Linux简介(一)
  2. pwa要离线html么,正确使用PWA
  3. Android解决button反复点击问题
  4. Cocos2d学习之路三(使用Zwoptex创建精灵表单和CCAnimate动画)
  5. 三菱PWM格式文件梯形图编码格式
  6. Android复习16【材料设计新特性:fragment、RecyclerView】
  7. Android 单击+双击+短按+长按 逻辑
  8. 怎么开发一个npm包
  9. LeetCode Contains Duplicate III
  10. JAVA :RESTLET开发实例(一)基于JAX-RS的REST服务
  11. mac安装rstudio_在Windows / Linux / Mac OS上安装R和RStudio入门
  12. 小程序不同页面之间通讯的解决方案 1
  13. 每天一道剑指offer-二叉搜索树与双向链表
  14. paip.tree 生成目录树到txt后的折叠查看
  15. 电脑预览,电脑怎么预览psd格式?
  16. 内外网隔离 双网隔离DoraOS云终端双桌面云办公应用
  17. SPSS入门笔记记录
  18. POJ 6184 【三元环 +分治】
  19. 饮水机和水桶图解RAID方式,强烈推荐
  20. 网站搭建需要什么技术?

热门文章

  1. 开源资产管理系统java_开源资产管理软件 GLPI 9.3.1 部署
  2. ajax invoke error,配置全局的异常捕获时,走ajax请求下面报错
  3. android获取图片缩略图,Android系获取图片和视频的缩略图
  4. linux 脚本停止自身,Linux系统定时任务时shell脚本停止执行如何解决?
  5. 跨域?拒绝说概念(内含demo)
  6. SpringCloud服务组合
  7. Linux日常运维--6
  8. javascript中apply、call和bind的区别
  9. C++反汇编-加法分析
  10. Linux命令学习手册-arp命令