ubuntu c++ http服务端event使用

2024-08-30 14:28

本文主要是介绍ubuntu c++ http服务端event使用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

程序:

#ifndef PLATFROMCOMMUNICATION_H
#define PLATFROMCOMMUNICATION_H#include <iostream>
#include <fstream>
#include <unistd.h>
#include <curl/curl.h>#include <net/if.h>
#include <sys/ioctl.h>
#include <arpa/inet.h>
#include <string.h>#include <event.h>
#include <event2/event.h>
#include <event2/buffer.h>
#include <event2/http.h>
#include <event2/http_struct.h>
#include <event2/http_compat.h>
#include <event2/util.h>#include <jsoncpp/json/json.h>#define ETH_NAME "ens33"
#define MYHTTPD_SIGNATURE   "MoCarHttpd v0.1"using namespace std;class RouteTasks{
public:RouteTasks();void init();private:static void login(struct evhttp_request *req, void *arg);string getIp();int m_port;int m_timeout;
};#endif // PLATFROMCOMMUNICATION_H
#include "platfromcommunication.h"RouteTasks::RouteTasks()
{m_port = 9000;m_timeout = 120;
}void RouteTasks::init()
{//服务端//初始化event APIevent_init();//创建一个http serverstruct evhttp *httpd;httpd = evhttp_start(getIp().c_str(), m_port);evhttp_set_timeout(httpd, m_timeout);//也可以为特定的URI指定callbackevhttp_set_cb(httpd, "/cgi-bin/entry.cgi/system/login", &RouteTasks::login, NULL);//循环处理eventsevent_dispatch();evhttp_free(httpd);
}void RouteTasks::login(evhttp_request *req, void *arg)
{char request_data[4096] = {0};//获取POST方法的数据size_t post_size = EVBUFFER_LENGTH(req->input_buffer);char *post_data = (char *) EVBUFFER_DATA(req->input_buffer);memcpy(request_data, post_data, post_size);printf("got control_device_start_stop connection post_data = %s, len =%ld\n", post_data, post_size);//解析获得的数据string deviceCode;string ptz;Json::Value jvalue;Json::Reader jreader;jreader.parse(request_data, jvalue);deviceCode = jvalue["sUserName"].asString();ptz = jvalue["sPassword"].asString();cout<<"============================\n"<<"deviceCode: "<<deviceCode<<" ptz: "<<ptz<<"\n-------------------------\n"<<endl;//给前段回复一个响应结果Json::Value root;Json::FastWriter fastWriter;root["code"] = Json::Value("200");root["msg"] = Json::Value("成功");cout<<"return post"<<fastWriter.write(root)<<endl;/* 输出到客户端 *///HTTP headerevhttp_add_header(req->output_headers, "Server", MYHTTPD_SIGNATURE);evhttp_add_header(req->output_headers, "Content-Type", "application/json; charset=UTF-8");evhttp_add_header(req->output_headers, "Connection", "close");//输出的内容struct evbuffer *buf;buf = evbuffer_new();evbuffer_add_printf(buf, "%s", fastWriter.write(root).c_str());//将封装好的evbuffer 发送给客户端evhttp_send_reply(req, HTTP_OK, "OK", buf);evbuffer_free(buf);
}string RouteTasks::getIp()
{struct sockaddr_in sin;struct ifreq ifr;int sockfd = socket(AF_INET, SOCK_DGRAM, 0);if(sockfd == -1) {perror("socket error");return "";}strncpy(ifr.ifr_name, ETH_NAME, IFNAMSIZ);if(ioctl(sockfd, SIOCGIFADDR, &ifr) == 0) {memcpy(&sin, &ifr.ifr_addr, sizeof (ifr.ifr_addr));cout<<ETH_NAME<<" ip : "<<inet_ntoa(sin.sin_addr)<<endl;return inet_ntoa(sin.sin_addr);}return "";
}
#include <iostream>
#include "platfromcommunication.h"using namespace std;//当向进程发出SIGTERM/SIGHUP/SIGINT/SIGQUIT的时候,终止event的事件侦听循环
void signal_handler(int sig) {switch (sig) {case SIGTERM:case SIGHUP:case SIGQUIT:case SIGINT:event_loopbreak();  //终止侦听event_dispatch()的事件侦听循环,执行之后的代码break;}
}int main()
{cout<<"hello world"<<endl;signal(SIGHUP, signal_handler);signal(SIGTERM, signal_handler);signal(SIGINT, signal_handler);signal(SIGQUIT, signal_handler);RouteTasks rt;rt.init();while (1) {sleep(1);}return 0;
}

编译: -levent

由于在ubuntu中https服务端event是阻塞式运行的,所以在正式项目中,可以将其放入线程中,这样不会阻塞程序运行,具体方式如下:上程序

#ifndef PLATFROMCOMMUNICATION_H
#define PLATFROMCOMMUNICATION_H#include <iostream>
#include <fstream>
#include <unistd.h>
#include <curl/curl.h>#include <net/if.h>
#include <sys/ioctl.h>
#include <arpa/inet.h>
#include <string.h>#include <event.h>
#include <event2/event.h>
#include <event2/buffer.h>
#include <event2/http.h>
#include <event2/http_struct.h>
#include <event2/http_compat.h>
#include <event2/util.h>#include <jsoncpp/json/json.h>
#include <boost/thread.hpp>#define ETH_NAME "ens33"
#define MYHTTPD_SIGNATURE   "MoCarHttpd v0.1"using namespace std;class RouteTasks{
public:RouteTasks();~RouteTasks();void init();private:static void login(struct evhttp_request *req, void *arg);static void init_thread(void *arg);void init_sub();string getIp();int m_port;int m_timeout;//创建一个http serverstruct evhttp *httpd;
};#endif // PLATFROMCOMMUNICATION_H
#include "platfromcommunication.h"RouteTasks::RouteTasks()
{m_port = 7777;m_timeout = 120;//初始化event APIevent_init();
}RouteTasks::~RouteTasks()
{evhttp_free(httpd);
}void RouteTasks::init()
{boost::thread t(&RouteTasks::init_thread, this);
}void RouteTasks::login(evhttp_request *req, void *arg)
{char request_data[4096] = {0};//获取POST方法的数据size_t post_size = EVBUFFER_LENGTH(req->input_buffer);char *post_data = (char *) EVBUFFER_DATA(req->input_buffer);memcpy(request_data, post_data, post_size);printf("got control_device_start_stop connection post_data = %s, len =%ld\n", post_data, post_size);//解析获得的数据string deviceCode;string ptz;Json::Value jvalue;Json::Reader jreader;jreader.parse(request_data, jvalue);deviceCode = jvalue["sUserName"].asString();ptz = jvalue["sPassword"].asString();cout<<"============================\n"<<"deviceCode: "<<deviceCode<<" ptz: "<<ptz<<"\n-------------------------\n"<<endl;//给前段回复一个响应结果Json::Value root;Json::FastWriter fastWriter;root["code"] = Json::Value("200");root["msg"] = Json::Value("成功");cout<<"return post"<<fastWriter.write(root)<<endl;/* 输出到客户端 *///HTTP headerevhttp_add_header(req->output_headers, "Server", MYHTTPD_SIGNATURE);evhttp_add_header(req->output_headers, "Content-Type", "application/json; charset=UTF-8");evhttp_add_header(req->output_headers, "Connection", "close");//输出的内容struct evbuffer *buf;buf = evbuffer_new();evbuffer_add_printf(buf, "%s", fastWriter.write(root).c_str());//将封装好的evbuffer 发送给客户端evhttp_send_reply(req, HTTP_OK, "OK", buf);evbuffer_free(buf);
}void RouteTasks::init_thread(void *arg)
{RouteTasks* rt = (RouteTasks*)arg;rt->init_sub();
}void RouteTasks::init_sub()
{//服务端
//    //初始化event API
//    event_init();//    //创建一个http server
//    struct evhttp *httpd;httpd = evhttp_start(getIp().c_str(), m_port);evhttp_set_timeout(httpd, m_timeout);//也可以为特定的URI指定callbackevhttp_set_cb(httpd, "/cgi-bin/entry.cgi/system/login", &RouteTasks::login, NULL);//循环处理eventsevent_dispatch();//    evhttp_free(httpd);
}string RouteTasks::getIp()
{struct sockaddr_in sin;struct ifreq ifr;int sockfd = socket(AF_INET, SOCK_DGRAM, 0);if(sockfd == -1) {perror("socket error");return "";}strncpy(ifr.ifr_name, ETH_NAME, IFNAMSIZ);if(ioctl(sockfd, SIOCGIFADDR, &ifr) == 0) {memcpy(&sin, &ifr.ifr_addr, sizeof (ifr.ifr_addr));cout<<ETH_NAME<<" ip : "<<inet_ntoa(sin.sin_addr)<<endl;return inet_ntoa(sin.sin_addr);}return "";
}
#include <iostream>
#include "platfromcommunication.h"using namespace std;//当向进程发出SIGTERM/SIGHUP/SIGINT/SIGQUIT的时候,终止event的事件侦听循环
void signal_handler(int sig) {switch (sig) {case SIGTERM:case SIGHUP:case SIGQUIT:case SIGINT:event_loopbreak();  //终止侦听event_dispatch()的事件侦听循环,执行之后的代码break;}
}int main()
{cout<<"hello world"<<endl;signal(SIGHUP, signal_handler);signal(SIGTERM, signal_handler);signal(SIGINT, signal_handler);signal(SIGQUIT, signal_handler);RouteTasks rt;rt.init();while (1) {sleep(1);}return 0;
}

这篇关于ubuntu c++ http服务端event使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1121074

相关文章

sky-take-out项目中Redis的使用示例详解

《sky-take-out项目中Redis的使用示例详解》SpringCache是Spring的缓存抽象层,通过注解简化缓存管理,支持Redis等提供者,适用于方法结果缓存、更新和删除操作,但无法实现... 目录Spring Cache主要特性核心注解1.@Cacheable2.@CachePut3.@Ca

C#下Newtonsoft.Json的具体使用

《C#下Newtonsoft.Json的具体使用》Newtonsoft.Json是一个非常流行的C#JSON序列化和反序列化库,它可以方便地将C#对象转换为JSON格式,或者将JSON数据解析为C#对... 目录安装 Newtonsoft.json基本用法1. 序列化 C# 对象为 JSON2. 反序列化

RabbitMQ 延时队列插件安装与使用示例详解(基于 Delayed Message Plugin)

《RabbitMQ延时队列插件安装与使用示例详解(基于DelayedMessagePlugin)》本文详解RabbitMQ通过安装rabbitmq_delayed_message_exchan... 目录 一、什么是 RabbitMQ 延时队列? 二、安装前准备✅ RabbitMQ 环境要求 三、安装延时队

Python ORM神器之SQLAlchemy基本使用完全指南

《PythonORM神器之SQLAlchemy基本使用完全指南》SQLAlchemy是Python主流ORM框架,通过对象化方式简化数据库操作,支持多数据库,提供引擎、会话、模型等核心组件,实现事务... 目录一、什么是SQLAlchemy?二、安装SQLAlchemy三、核心概念1. Engine(引擎)

Java Stream 并行流简介、使用与注意事项小结

《JavaStream并行流简介、使用与注意事项小结》Java8并行流基于StreamAPI,利用多核CPU提升计算密集型任务效率,但需注意线程安全、顺序不确定及线程池管理,可通过自定义线程池与C... 目录1. 并行流简介​特点:​2. 并行流的简单使用​示例:并行流的基本使用​3. 配合自定义线程池​示

Ubuntu如何升级Python版本

《Ubuntu如何升级Python版本》Ubuntu22.04Docker中,安装Python3.11后,使用update-alternatives设置为默认版本,最后用python3-V验证... 目China编程录问题描述前提环境解决方法总结问题描述Ubuntu22.04系统自带python3.10,想升级

Python 基于http.server模块实现简单http服务的代码举例

《Python基于http.server模块实现简单http服务的代码举例》Pythonhttp.server模块通过继承BaseHTTPRequestHandler处理HTTP请求,使用Threa... 目录测试环境代码实现相关介绍模块简介类及相关函数简介参考链接测试环境win11专业版python

GO语言中函数命名返回值的使用

《GO语言中函数命名返回值的使用》在Go语言中,函数可以为其返回值指定名称,这被称为命名返回值或命名返回参数,这种特性可以使代码更清晰,特别是在返回多个值时,感兴趣的可以了解一下... 目录基本语法函数命名返回特点代码示例命名特点基本语法func functionName(parameters) (nam

使用shardingsphere实现mysql数据库分片方式

《使用shardingsphere实现mysql数据库分片方式》本文介绍如何使用ShardingSphere-JDBC在SpringBoot中实现MySQL水平分库,涵盖分片策略、路由算法及零侵入配置... 目录一、ShardingSphere 简介1.1 对比1.2 核心概念1.3 Sharding-Sp

深入解析C++ 中std::map内存管理

《深入解析C++中std::map内存管理》文章详解C++std::map内存管理,指出clear()仅删除元素可能不释放底层内存,建议用swap()与空map交换以彻底释放,针对指针类型需手动de... 目录1️、基本清空std::map2️、使用 swap 彻底释放内存3️、map 中存储指针类型的对象