libevent和libcurl实现http和https服务器 cJSON使用
前言
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使用相关推荐
- 微信支付HTTPS服务器证书验证(PHP)
PHP代码验证是否包含CA证书 如果无法通过验证,请点击连接查看官方操作,安装相应的ca证书即可 # test_wechat_ca.php <?php $data = array('mch_id ...
- nginx 学习笔记(9) 配置HTTPS服务器--转载
HTTPS服务器优化 SSL证书链 合并HTTP/HTTPS主机 基于名字的HTTPS主机 带有多个主机名的SSL证书 主机名指示 兼容性 配置HTTPS主机,必须在server配置块中打开SSL协议 ...
- Nodejs 搭建https服务器(一)
2019独角兽企业重金招聘Python工程师标准>>> 1. 搭建https服务器---前奏 首先需要理解几个概念 1. HTTP是一个网络协议,是专门用来传输 Web 内容; 2. ...
- android 访问https服务器
之前,我讲了如何让tomcat支持https访问,当时浏览器通过https:localhost:8443即可访问tomcat.可是android此时如何访问已经搭建好的tomcat的https了?我在 ...
- spark在服务器运行示例_创建示例HTTPS服务器以获取乐趣和收益
spark在服务器运行示例 通常,在开发或/和针对真实场景进行测试期间,我们(开发人员)面临着运行成熟的HTTPS服务器的需求,可能同时进行一些模拟. 在JVM平台上,除非您知道适合此工作的正确工具, ...
- 创建示例HTTPS服务器以获取乐趣和收益
通常,在开发人员或/和针对实际场景进行测试期间,我们(开发人员)面临着运行成熟的HTTPS服务器的需求,可能同时进行一些模拟. 在JVM平台上,除非您知道适合此工作的正确工具,否则它过去并不是一件容易 ...
- 使用nginx搭建https服务器
最近在研究nginx,整好遇到一个需求就是希望服务器与客户端之间传输内容是加密的,防止中间监听泄露信息,但是去证书服务商那边申请证书又不合算,因为访问服务器的都是内部人士,所以自己给自己颁发证书,忽略 ...
- VC++访问HTTPS服务器(不受限制)
之前用VC客户端访问HTTPS服务器时,遇到"认证作者无效或者不正确","证书已失效"及类似的问题相当棘手,在这里我把可以忽略这些认证的方法写出来,让遇到相同问 ...
- NGINX SSL配置之设置HTTPS服务器
NGINX SSL配置 本节介绍如何在NGINX和NGINX Plus上配置HTTPS服务器. 设置HTTPS服务器 要设置HTTPS服务器,请在您的nginx.conf文件中的块中ssl将该list ...
最新文章
- Linux简介(一)
- pwa要离线html么,正确使用PWA
- Android解决button反复点击问题
- Cocos2d学习之路三(使用Zwoptex创建精灵表单和CCAnimate动画)
- 三菱PWM格式文件梯形图编码格式
- Android复习16【材料设计新特性:fragment、RecyclerView】
- Android 单击+双击+短按+长按 逻辑
- 怎么开发一个npm包
- LeetCode Contains Duplicate III
- JAVA :RESTLET开发实例(一)基于JAX-RS的REST服务
- mac安装rstudio_在Windows / Linux / Mac OS上安装R和RStudio入门
- 小程序不同页面之间通讯的解决方案 1
- 每天一道剑指offer-二叉搜索树与双向链表
- paip.tree 生成目录树到txt后的折叠查看
- 电脑预览,电脑怎么预览psd格式?
- 内外网隔离 双网隔离DoraOS云终端双桌面云办公应用
- SPSS入门笔记记录
- POJ 6184 【三元环 +分治】
- 饮水机和水桶图解RAID方式,强烈推荐
- 网站搭建需要什么技术?
热门文章
- 开源资产管理系统java_开源资产管理软件 GLPI 9.3.1 部署
- ajax invoke error,配置全局的异常捕获时,走ajax请求下面报错
- android获取图片缩略图,Android系获取图片和视频的缩略图
- linux 脚本停止自身,Linux系统定时任务时shell脚本停止执行如何解决?
- 跨域?拒绝说概念(内含demo)
- SpringCloud服务组合
- Linux日常运维--6
- javascript中apply、call和bind的区别
- C++反汇编-加法分析
- Linux命令学习手册-arp命令