libevent的安装

libevent-2.1.12-stable.tar.gz 立即下载

从github上下载压缩包

libevent的github下载的地址
在这里插入图片描述

将压缩包拷贝到unbuntu22.04的虚拟机上面

wuhaonan:match-game$ls
libevent-2.1.12-stable  libevent-2.1.12-stable.tar.gz
wuhaonan:match-game$tar -zxvf libevent-2.1.12-stable.tar.gz
cd libevent-2.1.12-stable
wuhaonan:libevent-2.1.12-stable	
wuhaonan:libevent-2.1.12-stable$cd cmake/
wuhaonan:libevent-2.1.12-stable$mkdir build && cd build
wuhaonan:build$ls
wuhaonan:build$cmake ..
wuhaonan:build$make
wuhaonan:build$sudo make install
wuhaonan:build$sudo ldconfig  # 更新库缓存
wuhaonan:build$ls /usr/local/include/event2/event.h  # 系统路径

测试libevent是否安装成功

demo.c

#include <event2/event.h>
#include <stdio.h>
/*
# 默认系统路径(/usr/local)
gcc demo.c -o demo -levent

# 自定义路径(如$HOME/local)
gcc demo.c -o demo -I$HOME/local/include -L$HOME/local/lib -levent

解决运行时库路径问题
若安装到非系统路径,需设置LD_LIBRARY_PATH:

bash
复制
export LD_LIBRARY_PATH=$HOME/local/lib:$LD_LIBRARY_PATH
./demo
*/
int main() {
    struct event_base *base = event_base_new();
    printf("LibEvent initialized successfully!\n");
    event_base_free(base);
    return 0;
}

执行gcc demo.c -o demo -levent

wuhaonan:match-game$gcc demo.c -o demo -levent
wuhaonan:match-game$./demo 
LibEvent initialized successfully!

经过测试安装成功

简单测试libevent

注:还需要安装cJSON

#include <event2/event.h>
#include <event2/http.h>
#include <event2/buffer.h>
#include <cjson/cJSON.h> // cJSON 头文件
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

// GET请求处理函数
// 第一个参数req是HTTP请求对象,第二个参数arg是用户自定义参数,这里没有使用
void handle_get(struct evhttp_request *req, void *arg)
{
    // 获取请求URI 将http请求的uri作为参数传递
    const char *uri = evhttp_request_get_uri(req);
    if (uri == NULL) {
        printf("URI is NULL\n");
        return;
    }
    // 打印请求URI
    printf("GET %s\n", uri);

    // 创建JSON响应
    cJSON *root = cJSON_CreateObject(); // 创建JSON对象 准备构建响应数据
    if (root == NULL)
    {
        printf("创建JSON对象失败\n");
        return;
    }

    // 构建响应数据
    cJSON_AddStringToObject(root, "status", "success"); // 添加字符串键值对
    cJSON_AddStringToObject(root, "message", "欢迎使用JSON服务"); // 添加字符串键值对

    // 构建JSON响应字符串 将JSON对象转换为JSON字符串
    char *json_str = cJSON_Print(root); // 打印JSON对象
    if (json_str == NULL)
    {
        printf("打印JSON对象失败\n");
        cJSON_Delete(root); // 释放JSON对象
        return;
    }

    struct evbuffer *buf = evbuffer_new(); // 创建缓冲区
    if (buf == NULL)
    {
        printf("创建缓冲区失败\n");
        cJSON_free(json_str); // 释放JSON字符串
        cJSON_Delete(root); // 释放JSON对象
        return;
    }

    evbuffer_add_printf(buf, "%s", json_str); // 添加JSON字符串到缓冲区
    
    // 设置JSON响应头
    // 为HTTP响应设置Content-Type头,指定响应的内容类型为JSON。这有助于客户端(如浏览器或API调用者)正确解析服务器返回的数据格式。
    evhttp_add_header(evhttp_request_get_output_headers(req), "Content-Type", "application/json"); // 设置响应头
    evhttp_add_header(evhttp_request_get_output_headers(req), "Access-Control-Allow-Origin", "*"); // 添加跨域支持
    evhttp_send_reply(req, HTTP_OK, "OK", buf); // 发送HTTP响应

    // 释放资源
    evbuffer_free(buf); // 释放缓冲区
    cJSON_Delete(root); // 释放JSON对象
    free(json_str); // 释放JSON字符串
}

// POST请求处理函数(JSON解析)
void handle_post(struct evhttp_request *req, void *arg)
{
    // 获取请求体中的数据
    struct evbuffer *input_buf = evhttp_request_get_input_buffer(req); // 获取请求输入缓冲区
    if (input_buf == NULL)  
    {
        printf("获取请求输入缓冲区失败\n");
        return;
    }
    size_t len = evbuffer_get_length(input_buf); // 获取输入缓冲区长度
    if (len == 0)
    {
        printf("输入缓冲区为空\n");
        return;
    }
    // +1是为了在结尾添加一个空字符,以便于字符串处理
    char *post_data = (char*)malloc(len + 1); // 分配内存
    if (post_data == NULL)
    {
        printf("分配内存失败\n");
        return;
    }
    // 从输入缓冲区中拷贝数据到post_data
    evbuffer_copyout(input_buf, post_data, len); // 拷贝缓冲区数据到post_data
    post_data[len] = '\0'; // 结尾添加空字符

    printf("原始POST数据: %s\n", post_data); // 打印原始POST数据

    // 解析JSON数据
    cJSON *root = cJSON_Parse(post_data); // 解析JSON字符串
    struct evbuffer *retbuf = evbuffer_new(); // 创建缓冲区
    if (retbuf == NULL)
    {
        printf("创建缓冲区失败\n");
        free(post_data); // 释放内存
        cJSON_Delete(root); // 释放JSON对象
        return;
    }
    if(!root){
        const char *error_ptr = cJSON_GetErrorPtr();
        if (error_ptr != NULL)
        {
            fprintf(stderr, "JSON解析错误前: %s\n", error_ptr);
        }
        evbuffer_add_printf(retbuf, "{\"error\":\"Invalid JSON\"}");
        evhttp_send_reply(req, HTTP_BADREQUEST, "Bad Request", retbuf);
        goto cleanup;
    }

    // 提取JSON字段 
    cJSON *username = cJSON_GetObjectItemCaseSensitive(root, "username"); // 获取username字段
    cJSON *age = cJSON_GetObjectItemCaseSensitive(root, "age"); // 获取age字段
    if(username == NULL || age == NULL) {
        printf("JSON数据不完整\n");
        evbuffer_add_printf(retbuf, "{\"error\":\"JSON数据不完整\"}");
        evhttp_send_reply(req, HTTP_BADREQUEST, "Bad Request", retbuf);
        goto cleanup;
    }

    // 构建响应JSON
    cJSON *response = cJSON_CreateObject(); // 创建JSON对象
    if (cJSON_IsString(username) && cJSON_IsNumber(age)) {
        cJSON_AddStringToObject(response, "status", "success");
        cJSON_AddStringToObject(response, "username", username->valuestring);
        cJSON_AddNumberToObject(response, "age", age->valueint);
    } else {
        cJSON_AddStringToObject(response, "error", "字段格式错误");
    }

    // 发送响应
    char *response_str = cJSON_PrintUnformatted(response); // 打印JSON对象
    evbuffer_add_printf(retbuf, "%s", response_str); // 添加JSON字符串到缓冲区
    evhttp_add_header(evhttp_request_get_output_headers(req), "Content-Type", "application/json"); // 设置响应头
    evhttp_add_header(evhttp_request_get_output_headers(req), "Access-Control-Allow-Origin", "*"); // 添加跨域支持
    evhttp_send_reply(req, HTTP_OK, "OK", retbuf); // 发送HTTP响应

    cleanup:
    // 资源清理
    evbuffer_free(retbuf);
    cJSON_Delete(root);
    if (response) cJSON_Delete(response); // 确保response不为NULL
    free(post_data);
    if (response_str) free(response_str); // 确保response_str不为NULL
}

/*
 gcc -o demo demo.c -levent -lcjson

# GET请求测试
curl "http://localhost:8080/api/get?name=John"

# POST测试(JSON格式)
curl -X POST -H "Content-Type: application/json" \
-d '{"username":"张三","age":25}' \
http://localhost:8080/api/post

# 响应结果:
欢迎使用libevent服务!
GET参数 name=John
*/
int main(void)
{
    // 事件库会监听各种事件(例如网络套接字上的读写事件,定时器事件等),并在这些事件发生时调用相应的回调函数来处理这些事件。
    struct event_base *base = event_base_new(); // 创建事件库 
    if(base == NULL) {
        printf("创建事件库失败\n");
        return 1;
    }

    // 创建HTTP服务器
    struct evhttp *http = evhttp_new(base); // 创建HTTP服务器
    if(http == NULL) {
        printf("创建HTTP服务器失败\n");
        return 1;
    }

    // 设置HTTP服务器的监听地址和端口
    if(evhttp_bind_socket(http, "0.0.0.0", 8080) != 0) {
        printf("绑定HTTP服务器失败\n");
        return 1;
    }

    // 设置HTTP服务器的回调函数
    evhttp_set_cb(http, "/api/get", handle_get, NULL); // 设置GET请求的回调函数
    evhttp_set_cb(http, "/api/post", handle_post, NULL); // 设置POST请求的回调函数

    printf("HTTP服务器启动成功,监听端口8080\n");
    // 事件循环,监听并处理事件 会阻塞,直到事件循环结束    
    event_base_dispatch(base); // 启动事件循环

    // 释放资源
    evhttp_free(http); // 释放HTTP服务器
    event_base_free(base); // 释放事件库
    return 0;
}

Python主要智能优化算法库汇总 最近几年简单浏览和对比了一些智能算法的库。现将各种库的主要信息、相关优缺点简单整理如下,各位同学可根据自己的需求和喜好进行选择。 文章目录1、DEAP2、mealpy3、scikit-opt (国产良心)4、Geat2(国产用心)5、pygmo26、pyswarms7、SciPy(想不到吧)小结 1、DEAP 项目地址:https://github.com/DEAP/deap 安装: pip install deap 优点: 起点高,发表在Journal of Machine Learning Rese 阅读详情

相关推荐

【计算机科学导论实验】加法图灵机模拟 题解

本文提供计算机科学导论课程“图灵机加法器”实验的个人思路,仅供参考。

Chavapa's blog 2576

CentOS 7 安装Libevent

1.下载安装包新版本是libevent-2.1.12-stable.tar.gz。(如果你的系统已经安装了libevent,可以不用安装)官网:http://www.monkey.org/~provos/libevent/2.创建目录3.解压4.进入目录5.设置安装路径。

zhouzhiwengang的专栏 2988

相控阵多功能雷达工作模式识别技术综述

本文综述了相控阵雷达工作模式识别技术的研究进展。首先介绍了相控阵雷达的典型工作模式分类及其信号特征参数,包括搜索模式(VS、RWS、TWS)、跟踪模式(STT、MTT、TAS)和其他模式(SAM、SAR)等。随后重点阐述了基于信号特征的识别方法,包括时域特征(PRI分析、脉冲幅度包络、数据率)、频域特征(载频变化、调制方式)和混合特征分析方法。最后讨论了当前技术面临的挑战与发展趋势,包括复杂信号环境下的识别难题、新型雷达技术的适应需求以及深度学习技术的应用前景。该领域的研究对电子侦察和威胁评估具有重要意义。

Grow into a more wonderful you 1794

在Ubuntu 18.04下安装libevent以及一些问题解决

error while loading shared libraries: libevent-2.1.so.7: cannot open shared object file

m0_75034791的博客 1069

基于Simulink的超级电容器充放电仿真

为了更好地理解和设计超级电容器的应用系统,通常需要进行详细的仿真分析。Simulink 提供了一个强大的仿真环境,可以用来设计、分析和验证超级电容器充放电系统的控制策略。本教程将详细介绍如何使用 Simulink 进行超级电容器充放电的仿真实例。如果你希望对超级电容器的充放电过程进行精确控制,可以添加一个简单的逻辑控制器来控制开关的状态。通过本教程,我们详细介绍了如何使用 Simulink 进行超级电容器充放电的仿真实例。2. 添加超级电容器模型。7. 添加控制器(可选)1. 调整超级电容器参数。

xiaoheshang_123的博客 518

使用 MATLAB/Simulink 对一个开关磁阻电机进行建模

*开关磁阻电机(Switched Reluctance Motor, SRM)**是一种新型的无刷电机,以其简单的机械结构、宽广的调速范围和较高的效率在工业应用中得到了广泛关注。SRM的独特之处在于其定子和转子均为凸极结构,并且通过改变绕组电流的方向来实现转矩的产生和控制。本教程将详细介绍如何使用对一个开关磁阻电机进行建模,并探讨其基本控制策略,特别是针对双凸极结构的SRM。本文介绍了如何使用构建一个开关磁阻电机的双凸极结构模型,并探讨了其基本控制策略。

amy_mhd的博客 203

Linux基础 (十八):Libevent 库的安装与使用

Libevent 是一个高效的、轻量级的事件通知库用于开发需要处理大量并发连接的网络应用程序。它提供了一种机制来执行回调函数,当特定事件发生在文件描述符上,或在超时发生时,Libevent 可以处理不同类型的事件,包括 I/O 事件、信号事件和定时事件。为每种事件类型定义相应的处理回调函数。例如,针对新连接的事件,定义一个回调函数来处理新连接;针对读写事件,定义相应的回调函数来处理数据的读写操作。这些回调函数是处理事件的核心逻辑,通过它们来实现具体的业务逻辑。

weixin_47040031的博客 4442

物联网与人工智能项目实战:构建智能农业监控系统

智能农业监控系统通过物联网技术实时监测农业环境中的各项数据(如土壤湿度、温度、光照强度等),并利用人工智能技术分析和预测农业生产的趋势,进而为农民提供决策支持。系统的核心目标是提高农作物的产量和品质,同时减少资源浪费,优化农田管理。环境监测:实时采集农田的温湿度、土壤湿度、光照等环境数据。作物生长监测:通过传感器和图像识别技术监测作物的生长状况。智能灌溉系统:根据土壤湿度和气候条件自动调整灌溉量。病虫害检测与预警:利用人工智能和图像识别技术自动检测作物病虫害,并及时给出预警。数据分析与决策支持。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 709

libevent下载与安装学习整理

libevent的下载与安装

dhusubing的博客 3074

SentEval学习笔记

SentEval allows you to evaluate your sentence embeddings as features for the followingdownstreamtasks: Task Type #train #test needs_train set_classifier MR movie review(影评) 11k 11k 1 1 CR product review(产品评述) ...

AlphaFinance 803

影楼精修-AI追色算法解析

本文解析了像素蛋糕软件中AI追色功能的技术原理与实现方案,为理解AI追色技术提供了实用参考。

Trent1985的专栏 2万+

Libevent安装

最近在学习libevent,记录一下安装过程,方便日后查看。 首先,安装openssl 1.下载openssl源码:/source/index.html (openssl.org) wget https://www.openssl.org/source/openssl-1.1.1l.tar.gz 2.解压 tar -zxvf openssl-1.1.1l.tar.gz cd openssl-1.1.1l/ 3.编译安装 ./config make -j16 sudo make inst.

WilliamCode的博客 2879

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

CentOS下如何安装libevent

<br />1.下载安装包<br />新版本是libevent-2.0.10-stable。(如果你的系统已经安装了libevent,可以不用安装)<br />官网:http://www.monkey.org/~provos/libevent/<br />下载:http://www.monkey.org/~provos/libevent-2.0.10-stable.tar.gz<br />2.解压 <br /># tar zxvf libevent-2.0.10-stable.tar.gz<br />3.进

zhangm168的专栏 2万+

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

如何编译和安装libevent

如何编译和安装libevent 编译和安装步骤: $ apt-get install git $ git clone https://github.com/libevent/libevent.git $ cd libevent $ apt-get install cmake $ apt-get install libssl-dev $ mkdir build && cd build $ cmake .. # Default to Unix Makefiles. $ make $ m

每一天都有新的希望 8516

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

安装libevent

文章目录 安装gcc yum -y install gcc 安装 openssl yum install -y openssl openssl-devel 安装nc,用于tcp/udp连接 yum install nmap-ncat.x86_64 -y 下载libevent wget https://github.com/libevent/libevent.git 解压libevent tar -xzvf libevent-2.1.12-stable.tar.gz 测试demo cd libeven

Nuan_Feng的博客 629

libevent(2)linux下安装libevent

linux下安装libevent。

1829

libevent安装方法

1.先用:ls -al /usr/lib | grep libevent  查看是否已安装,如果已安装且版本低于1.3,则先通过:rpm -e libevent —nodeps 进行卸载。   2.下载libevent安装包:libevent-1.4.13-stable.tar.gz,然后解压。   3.切换到解压后的 libevent 主目录:cd libevent-

danelumax2的专栏 1066

总结libevent安装方法

1.先用:ls -al /usr/lib | grep libevent  查看是否已安装,如果已安装且版本低于1.3,则先通过:rpm -e libevent —nodeps 进行卸载。   2.下载libevent安装包:libevent-1.4.13-stable.tar.gz,然后解压。   3.切换到解压后的 libevent 主目录:cd libevent-

轻锋的专栏 5592

libevent安装

1.先用:ls -al /usr/lib | grep libevent  查看是否已安装,如果已安装且版本低于1.3,则先通过:rpm -e libevent —nodeps 进行卸载。   2.下载libevent安装包:libevent-2.0.21-stable.tar.gz,然后解压。   3.切换到解压后的 libevent 主目录:cd libevent-2.0.21-sta

763

libevent安装总结

1.先用:ls -al /usr/lib | grep libevent 查看是否已安装,如果已安装且版本低于1.3,则先通过:rpm -e libevent —nodeps 进行卸载。 2.下载libevent安装包:libevent-2.0.21-stable.tar.gz,然后解压。    如果你的系统已经安装了libevent,可以不用安装    官网:http://www.m

jinfg2008的专栏 6594

安装Libevent

今天,在Linux 2.6内核的Ubuntu上编译运行依程序,出现了错误:Event library not defined。分析了一下,应该是 libevent 的问题。 1、libevent 介绍 libevent API提供当文件描述符上的特定事件发生时或达到超时之后执行回调函数的机制。此外,libevent的还支持因信号或经常超时引发的回调。libevent 提供了多种I/O机制,

刘锐群的笔记 1208

Ubuntu安装及测试Libevent

在官网下载最新的libevent安装包: 直接下载: http://libevent.org/ 在当前目录下解压安装包: tar -zxvf libevent-xxxx.tzr.gz cd libevent-2.0.22-stable 配置安装库的目标路径: ./configure --prefix=/usr 编译安装libevent库: make sudo make install ...

... 2790

libevent安装与libevent定时器

主要是参考了一下网上的方法,http://blog.sina.com.cn/s/blog_4b93170a0100mbm9.html 并自己实际操作了一下,针对自己出现的一些情况进行说明。并在实际编译链接过程中进行实践。 这些其实都是一些基本的简单操作,但是对于我这种菜鸟级别的小白来说,还是挺好的,高手请口下留情。 本文主要针对mac系统,对linux系统也适用。

wosshzhb的专栏 813

CentOS7下安装libevent

CentOS7下安装libevent

龙木南的博客 1724

libevent安装和第一个libevent程序

1、基础环境的搭建:在CentOS6.5上用eclipse写HelloWorld.cpp 2、libevent的安装 点击下载libevent2.1.8 tar -xzvf libevent-2.1.8-stable.tar.gz cd libevent-2.1.8-stable ./configure --prefix=/usr make make install 这时候应该就能够...

qq_27607539的博客 1221
上一篇: 学习数据存储
下一篇: ubuntu链接动态库的问题
吴_知遇
博客等级 码龄7年 100粉丝 26原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值