libevent学习 evhttp

libevent evhttp使用 一、libevent evhttp使用 1、基本流程 http服务端使用到的借口函数及流程如下 1)、创建event_base和evhttp struct event_base *event_base_new(void); struct evhttp *evhttp_new(struct event_base *base); 2)、绑定地址和端口 int evhttp_bind_socket(st... 阅读详情

简介

在libevent中,封装了http模块,包括很多相关的接口。

一个http server 的创建步骤

1、初始化event模块
2、启动http服务端
3、设置事件处理函数
4、监听事件

常用接口(按调用顺序排列)

函数名介绍
struct event_base * event_init(void)创建一个event_base,没有event_base是不能创建evhttp的
struct evhttp * evhttp_start(const char *address, ev_uint16_t port)传入ip和端口创建一个http server
void evhttp_set_timeout(struct evhttp* http, int timeout)设置超时时间
int evhttp_set_cb(struct evhttp *http, const char *uri,void (*cb)(struct evhttp_request *, void *), void *cbarg)设置不同访问路径对应的回调函数
int evhttp_set_gencb(struct evhttp *http,void (*cb)(struct evhttp_request *, void *), void *cbarg)设置默认回调函数
int event_dispatch(void)循环检测时间发生

另外还有一些在回调函数中用到的接口

函数介绍
evhttp_request_get_evhttp_uri(req)获取一个http请求的uri
char * post_data=(char*)EVBUFFER_DATA(req->input_buffer)获取http请求的请求体
evhttp_uri_join(const_cast<struct evhttp_uri*>(evhttp_uri),url,2020)将解析数据中的uri部分连接在一起,形成uri - reference。
char post_data=(char)EVBUFFER_DATA(req->input_buffer)把请求体转为文本
evbuffer_add_printf(retbuff,“Test Get is ok\n”)给http响应报文输入数据
evhttp_send_reply(req,HTTP_OK,“Client is ok”,retbuff)发送http响应报文
evbuffer_free(retbuff)释放响应报文的缓冲
evhttp_uri_get_path(evhttp_uri)从之前提取的uri中获取path
evhttp_uri_get_query(evhttp_uri)从之前提取的uri中获取query

简单的使用

一个用libevent 的evhttp实现的简单http服务器,具有默认uri响应和路径为get和post的响应,并在回调函数中解析http请求内容。

#include<stdio.h>
#include<stdlib.h>
#include<evhttp.h>
#include<event.h>
#include<string.h>
#include"event2/http.h"
#include"event2/event.h"
#include"event2/buffer.h"
#include"event2/bufferevent.h"
#include"event2/bufferevent_compat.h"
#include"event2/http_struct.h"
#include"event2/util.h"
#include"event2/listener.h"

void Test_Get(struct evhttp_request *req,void *arg){
	{
		//parse
	}
	struct evbuffer* retbuff=evbuffer_new();
	if(retbuff==NULL){
		printf("retbuff is NULL\n");
		return;
	}
	evbuffer_add_printf(retbuff,"Test Get is ok\n");
	evhttp_send_reply(req,HTTP_OK,"Client is ok",retbuff);
	evbuffer_free(retbuff);

}

void Test_Post(struct evhttp_request *req,void* arg){
	
	//get data   evbuffer_pullup()
	const struct evhttp_uri* uri=evhttp_request_get_evhttp_uri(req);
	char * post_data=(char*)EVBUFFER_DATA(req->input_buffer);

	const char* path=evhttp_uri_get_path(uri);
	const char* query=evhttp_uri_get_query(uri);
	
	printf("path:%s\n",path);
	printf("query:%s\n",query);
	printf("post data:%s\n",post_data);
	

	struct evbuffer* retbuff=evbuffer_new();
	if(retbuff==NULL){
		printf("retbuff is NULL\n");
		return;
	}
	evbuffer_add_printf(retbuff,"Test Post is ok\n");
	evbuffer_add_printf(retbuff,"path is [%s] and post body is [%s]\n",path,post_data);

	evhttp_send_reply(req,HTTP_OK,"Client is ok",retbuff);
	evbuffer_free(retbuff);

}

void cb_gen(struct evhttp_request* req,void * arg){
	const struct evhttp_uri* evhttp_uri=evhttp_request_get_evhttp_uri(req);
	char url[2020];
	evhttp_uri_join(const_cast<struct evhttp_uri*>(evhttp_uri),url,2020);
	char *post_data=(char*)EVBUFFER_DATA(req->input_buffer);

	printf("url: %s\n",url);
	printf("path: %s\n",evhttp_uri_get_path(evhttp_uri));
	printf("query: %s\n",evhttp_uri_get_query(evhttp_uri));
	printf("data: %s\n",post_data);

	struct evbuffer* evbuf=evbuffer_new();
	evbuffer_add_printf(evbuf,"url is [%s] and post body is [%s]\n",url,post_data);
	evhttp_send_reply(req,HTTP_OK,"OK",evbuf);
	evbuffer_free(evbuf);
}

int main(){
	short http_port=8081;
	event_init();
	struct evhttp* http_server=evhttp_start(INADDR_ANY,http_port);
	if(http_server==NULL){
		printf("http server not started\n");
		return -1;
	}
	evhttp_set_timeout(http_server,5);
	evhttp_set_cb(http_server,"/post",Test_Post,NULL);
	evhttp_set_cb(http_server,"/get",Test_Get,NULL);
	evhttp_set_gencb(http_server,cb_gen,NULL);
	event_dispatch();
	evhttp_free(http_server);
	return 0;
}
使用libevent搭建简单http服务器 @使用libevent搭建简单http服务器 一、libevent 的下载 可通过官网直接进行下载libevent库;例子使用的是V2.1.1版本,下载完成后,解压;可以再解压目录下获取 Makefile.nmake 文件,可通过nmake工具自己编译,注意编译的项目属性要与使用的版本一致,否则会出现编译异常的问题;下面链接是编译完成的VS2008版本MD和MT版本的静态库,可直接使用;如所需版本不同,请不要下载; @VS2008_MD(MT)_staic_lib 二、下载完成后,开始搭建环境: 1,使用 阅读详情

相关推荐

libevent evhttp多线程改造:主从Reactor架构与性能调优实战

在高并发HTTP服务场景中,单线程事件循环模型常因CPU利用率低、QPS受限而成为瓶颈。其根本原因在于一个event_base仅能绑定一个线程,所有连接与请求处理串行执行。通过引入多线程架构,将连接分发至独立的工作线程,每个线程持有自己的event_base与evhttp实例,可显著提升吞吐量与CPU利用率。该方案适用于需要高并发、低延迟的HTTP服务,如内部RPC、API网关等。主从Reactor模式结合socketpair传递连接,配合背压队列与优雅退出机制,是libevent evhttp多线程改造的

weixin_33831196的博客 244

libevent(17)evhttp的API及server端代码

libevent基于evhttp的API及http server端代码。

3072

libevent详解四(http服务)

怎么使用多线程

傻子和石像的专栏 1409

网络编程之http服务器(C/C++)(基于libevent实现)

基于libevent实现一个http服务端服务。

zhoubiaodi的博客 2964

完整内、外期货量化交易系统源码可售

支持客户登录校验,支持所有的实时行情和汇总报价功能、实时资讯(报价,列表,分时,分钟成交明晰,),多线程支持盘后收盘作业下载(日线,5分钟线,15分钟, 30分钟,60分钟线,),支持从服务器下载相关运行配置(来自服务器动态配置信息,如收盘日期等),实现状态条显示。收盘作业包括日线、5分钟线、15分钟线、30分钟、60分钟线、2小时线、4小时线每日分时走势。综合信息栏显示用户账户信息、合约信息、当日委托单记录、当日成交记录、当日平仓记录、当日跟单记录、当日(月/周)排行榜、下单栏、持仓信息;

qq_35600909的博客 1805

Python小波变换实战:用PyCWT分析气候数据(附完整代码)

本文详细介绍了如何使用Python中的PyCWT库进行小波变换分析,特别针对气候数据(如NINO3海温异常数据)的多尺度周期性特征提取。通过完整的代码示例,从数据预处理、小波参数配置到结果可视化,逐步指导读者掌握小波变换在气候研究中的实际应用。

weixin_29088655的博客 281

网编编程-evhttp小试

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/queue.h> #include <event.h> #include <event2/http.h> #include <event2/http_struct.h> #include <event2/http_compat.h> #include &lt.

算法攻城狮 1363

【11】科曼医疗——科曼医疗 嵌入式--面试,校招,面试问答记录

科曼医疗嵌入式校招面试记录:3位面试官分别考察应用层技术、底层技术和HR面。技术问题涵盖C++特性(多态、虚函数、指针与引用区别)、内存管理(malloc与new对比)、嵌入式基础(51最小系统、IIC/SPI协议)及项目经验(智能黑板擦专利项目)。同时考察了Linux使用经验、STM32开发及嵌入式操作系统认知。最后环节应聘者询问了开发环境及面试流程。面试内容全面覆盖嵌入式开发核心知识点。

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 1250

libevent evhttp学习——http客户端

基本环境使用版本为libevent-2.1.5,目前为beta版,其中evhttp和旧版区别在于新增了如下接口// 设置回调函数,在包头读取完成后回调 void evhttp_request_set_header_cb (struct evhttp_request *, int(*cb)(struct evhttp_request *, void *))// 设置回调函数,在body有数据返回后回调

littlewhite1989的专栏 1万+

YOLOv12改进策略【Neck】| CGA Fusion:内容引导的注意力融合模块,空间权重引导的多模态特征自适应融合

本文记录的是利用CGA Fusion 模块改进 YOLOv12 的多模态融合部分。(Content-Guided Attention Fusion)通过内容引导注意力生成空间权重,引导高低层特征的自适应融合。本文利用模块,通过内容引导注意力生成空间权重,自适应地融合两个模态的特征,在特征融合阶段实现跨模态语义对齐与噪声抑制,增强对不同模态互补特征的利用能力,从而提升模型在多模态场景下的检测鲁棒性与准确性。DEA-Net: Single image dehazing based on detail-enhan

Limiiiing的博客 433

NSIS教程(6): 使用第三方插件

NSIS内置了很多指令,这些指令可以满足我们基本需求,但难免会遇到NSIS没有内置的功能,如进程操作,后台运行(即多线程),7z压缩等等,这个时候我们就需要借助第三方插件来满足我们所需要的功能了。 一、插件获取 NSIS官方收录插件的网址是:http://nsis.sourceforge.net/Category:Plugins,我们可以在这个网站上查找和下载我们需要的插件,该网站上针对每

while(1) { smile(); } 9万+

libevent evhttp学习——http服务端

http服务端相对客户端要简单很多,我们仍旧使用libevent-2.1.5版本,服务端接口和2.0版本没有区别基本流程http服务端使用到的借口函数及流程如下 创建event_base和evhttpstruct event_base *event_base_new(void); struct evhttp *evhttp_new(struct event_base *base); 绑定地址和端口i

littlewhite1989的专栏 7045

ubuntu-25.04-desktop-amd64 工具VMware-tools 正确安装方法

摘要:Ubuntu 25.04虚拟机安装VMware Tools后无法实现主机与虚拟机间的文件复制粘贴和拖拽功能,问题可能源于工具兼容性。建议优先安装open-vm-tools套件(含open-vm-tools-desktop),而非官方VMware Tools。具体方案:通过终端执行安装命令后重启系统。该方法已实测有效解决该兼容性问题。(149字)

安徽锐锋科技-沐雨潇竹 672

libevent向服务器发消息,libevent evhttp学习——http服务端

http服务端相对客户端要简单很多,我们仍旧使用libevent-2.1.5版本,服务端接口和2.0版本没有区别基本流程http服务端使用到的借口函数及流程如下创建event_base和evhttpstruct event_base *event_base_new(void);struct evhttp *evhttp_new(struct event_base *base);绑定地址和端口int...

weixin_36102776的博客 466

检测头篇 | 手把手教你如何去更换YOLOv8的检测头为ASFF_Detect

自适应空间特征融合(ASFF)的主要原理旨在解决单次检测器中不同尺度特征的不一致性问题。具体来说,ASFF通过动态调整来自不同尺度特征金字塔层的特征贡献,确保每个检测对象的特征表示是一致且最优的。本文所做出的改进是将YOLOv8的检测头更换为ASFF_Detect。🌈

小哥谈 2497

手把手安装GNN必备库 —— pytorch_geometric

PyG全称是Pytorch Geometric,它是一个基于Pytorch构建的库,可以帮助用户快速构建和训练自己的图神经网络模型。PyG中实现了很多先进(state of the art)的GNN模块,例如GCN、GraphSage、GAT、SGC、GIN等等。此外,PyG中还包含了大量的benchmark图数据集、丰富的图数据操作方法、支持多GPU。

m0_51339444的博客 2380

libevent(九)evhttp

用libevent构建一个http server非常方便,可参考libevent(六)http server。 主要涉及的一个结构体是evhttp: struct evhttp { /* Next vhost, if this is a vhost. */ TAILQ_ENTRY(evhttp) next_vhost; /* All listeners f...

weixin_34294649的博客 598

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

libevent evhttp实现的http客户端发送POST请求

基本环境 使用版本为libevent-2.1.5,目前为beta版,其中evhttp和旧版区别在于新增了如下接口 // 设置回调函数,在包头读取完成后回调 void evhttp_request_set_header_cb (struct evhttp_request *, int(*cb)(struct evhttp_request *, void *)) // 设置回调函数,在body有数据返回后回调 void evhttp_request_set_chunked_cb (struct evht

yufeng1108的专栏 6902

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

libevent(十三)evhttp事件处理流程

在libevent(六)http server中,作为一个单线程http server,不仅要监听每个连接的到来,还要监听每个连接上的I/O事件。 查看源码可知,在evhttp_bind_socket中设置了accept的回调函数:accept_socket_cb。 /* Listener callback when a connection arrives at a server. */...

weixin_34082854的博客 1924

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

10分钟搭建高性能嵌入式HTTP服务器:libevent evhttp完全实战

libevent 是一款成熟的事件通知库,其内置的 evhttp 模块可以让开发者用几百行代码搭建高性能嵌入式HTTP服务器,单进程即可支撑海量并发连接。本文带你从零认识 libevent evhttp,10 分钟跑通一个可处理静态文件与自定义接口的 HTTP 服务器,并附上客户端请求与调优技巧,适合新手快速上手。 ## 为什么选择 libevent evhttp 搭建嵌入式HTTP服务器?

gitblog_00620的博客 345

evhttp

将之前用gsoap写的webserver改为使用libevent库。gsoap是为了实现soap协议,如果只用来实现restful风格的接口的话,就有很多多余的东西了,而且处理起来也不太方便。虽然之前使用过libevent,不过evhttp还是第一次用,还是一如既往的好用。再此记录下,方便以后取用。libevent库使得高并发响应HTTP Server的编写变得很容易。因此实际中,使用libeven

xuleisdjn的专栏 4391

libevent 编写一个httpclient

背景: 基于libevent实现了一个http服务器, 也想使用libevent 实现一个客户端, 发现网上的例子要不是代码不全(编译不过,)要不就是简要说明有些还有内存泄漏. 基于此一个全面的,给初学者参考使用. http客户端使用到的接口函数及请求流程如下 初始化event_base和evdns_base struct event_base *event_base_new(void); struct evdns_base * evdns_base_new(struct event_bas..

caolinqing1的专栏 1022

❤️【Libevent】 http.h头文件解析

/* * Copyright (c) 2000-2007 Niels Provos * Copyright (c) 2007-2012 Niels Provos and Nick Mathewson * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are me.

好习惯成就伟大 2157

libevent evhttp多线程

evhttp多线程

深之JohnChen的专栏 1869
上一篇: c++实现一个高并发服务器(三)服务器
下一篇: libevent库学习 链接监听器evconnlistener
Sweler*19
博客等级 码龄7年 65粉丝 56原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值