分享一款专为嵌入式系统设计的HTTP库

转自 | 嵌入式大杂烩

在物联网和边缘计算时代,嵌入式设备需要轻量高效的HTTP服务能力。

传统的HTTP服务器如Nginx、Apache虽然功能强大,但资源占用过高,难以满足嵌入式场景需求。今天为大家介绍一款专为嵌入式系统设计的开源HTTP库——libevhtp

项目地址:https://github.com/Yellow-Camper/libevhtp

一、libevhtp简介

libevhtp是基于libevent开发的高性能HTTP库,采用C语言编写,专为资源受限环境设计。它提供了简洁的API接口,支持构建高效的HTTP服务器和客户端,特别适合嵌入式Linux环境。

核心特性

  • 高性能事件驱动:基于libevent实现异步I/O

  • 极简资源占用:编译后仅数百KB

  • 零拷贝设计:高效处理网络数据

  • 灵活路由系统:支持RESTful风格路由

  • HTTPS支持:集成OpenSSL加密通信

优缺点

优点

  • 毫秒级启动时间

  • 内存占用低(<1MB)

  • 高并发连接处理能力

  • 简洁易用的API设计

缺点

  • 功能较基础(无高级HTTP特性)

  • 社区生态相对较小

  • 文档完整性有待提高

二、libevhtp实战

1、安装依赖

# 安装依赖
sudo apt install libevent-dev libssl-dev

# 编译安装
git clone https://github.com/Yellow-Camper/libevhtp.git
cd libevhtp/build
cmake .. -DEVHTP_DISABLE_SSL=ON  # 禁用SSL简化编译
make
sudo make install

2、简易HTTP服务器

流程图:

代码:

#include <evhtp.h>
#include <string.h>
#include <stdio.h>

// 请求处理回调
void home_cb(evhtp_request_t* req, void* arg) 
{
    constchar* response = "<h1>Welcome to libevhtp!</h1>"
                           "<p>Embedded HTTP Server</p>";

    printf("recvice request!!!\n");

    evbuffer_add(req->buffer_out, response, strlen(response));
    evhtp_send_reply(req, EVHTP_RES_OK);
}

int main(void) 
{
    printf("================= Embedded HTTP Server Demo =================\n");

    // 创建基础事件循环
    struct event_base* base = event_base_new();
    
    // 初始化evhtp实例
    evhtp_t* htp = evhtp_new(base, NULL);
    
    // 注册根路径处理函数/路由注册
    evhtp_set_cb(htp, "/", home_cb, NULL);
    
    // 绑定端口
    evhtp_bind_socket(htp, "0.0.0.0", 8080, 1024);
    
    // 启动事件循环
    event_base_loop(base, 0);
    
    // 资源清理
    evhtp_unbind_socket(htp);
    evhtp_free(htp);
    event_base_free(base);
    
    return0;
}
  • 创建基础事件循环:event_base_new()创建 libevent 的事件循环基础,这是 libevhtp 运行的核心环境,为后续处理网络事件提供支持。

  • 初始化evhtp实例:evhtp_new()初始化 HTTP 处理上下文,并与前面创建的 event_base 关联,建立起整个 HTTP 服务的基础框架。

  • 路由注册:evhtp_set_cb()将 URL 路径与处理函数绑定,这里将根路径/映射到home_cb函数,使得访问根路径时能触发相应处理逻辑 。

  • 服务器绑定:evhtp_bind_socket()指定服务器监听的 IP 和端口,最后一个参数是 backlog 队列大小,用于设置等待连接的最大数量。

  • 启动事件循环:libevhtp 运行。

  • 请求处理回调:通过evbuffer_add把需要应答的内容添加到输出缓冲区,再用evhtp_send_reply发送响应,完成一次请求的处理。

编译命令:

gcc demo.c -o demo -levhtp -levent

运行demo启动http服务器,然后浏览器地址栏输入:http://localhost:8080。

以上就是本次的分享。如果文章对你有帮助,欢迎关注、转发!下一篇我们一起学习libevhtp的代码。

------------ END ------------

图片

●专栏《嵌入式工具

●专栏《嵌入式开发》

●专栏《Keil教程》

●嵌入式专栏精选教程

关注公众号回复“加群”按规则加入技术交流群,回复“1024”查看更多内容。

点击“阅读原文”查看更多分享

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值