libevent框架常用接口及通信测试

Libevent0.1之测试Libevent自带的例子 因为0.1版本的只支持linux版本,所以本文章中的测试环境是在ubuntu下进行。 准备工作 下载0.1版本的libevent。 开始 先解压下载下来的源码 Download$ tar xzvf libevent-0.1.tar.gz 编译库文件 Download$ cd libevent Download/libevent$ ./configure Download/libe 阅读详情

下面是libevent框架的简单测试代码,是在学习libevent的时候写的测试代码,目的是熟悉libevent的API接口和使用流程,没有涉及到数据格式或数据解析,就是单纯的收发数据并输出到终端,并且不会对原理做解释,只是单纯的使用libevent。代码都有很详细的注释,比较容易看懂。

常用接口:

struct event_base *event_base_new();  //创建一个事件处理框架
void event_base_free(struct event_base *base); //释放资源
int event_base_dispatch(struct event_base *base); //开启事件循环

struct event *event_new(structevent_base *base, evutil_socket_t fd, short what, event_callback_fn cb, void*arg); //创建事件
常用事件标志:
EV_READ     可读的文件描述符
EV_WRITE    可写的文件描述符
EV_SIGNAL   信号检测
EV_PERSIST  持久事件

int event_add(struct event *ev,const struct timeval *tv); //将事件添加到事件处理框架中
int event_del(struct event *ev);  //删除事件
void event_free(struct event *event);  //释放资源

struct bufferevent *bufferevent_socket_new(
struct event_base *base, evutil_socket_t fd, enum bufferevent_options options);  //创建带缓冲区的事件
注:options参数选择:
BEV_OPT_CLOSE_ON_FREE:当bufferevent释放时,关闭底层传输
BEV_OPT_THREADSAFE: 为bufferevent使用lock
BEV_OPT_DEFER_CALLBACKS: 将callback设为延迟的
BEV_OPT_UNLOCK_CALLBACKS:默认情况下如果有THREADSAFE标志,调用callback时会加锁。使用这个标志是的即便有THREADSAFE标志,调用callback也不加锁   

connect()函数的封装
int bufferevent_socket_connect (struct bufferevent *bev,
                                struct sockaddr    *address,
                                int                 addrlen);

设置回调函数
void bufferevent_setcb(struct bufferevent *bufev,
bufferevent_data_cb readcb, bufferevent_data_cb writecb, bufferevent_event_cb eventcb, void *cbarg);

void bufferevent_enable(struct bufferevent *bufev, short events);  //设置回调函数权限可用
void bufferevent_disable(struct bufferevent *bufev, short events);
void bufferevent_free(struct bufferevent *bev); //释放资源

读写缓冲区数据
int bufferevent_write(struct bufferevent *bufev, const void *data, size_t size);
size_t bufferevent_read(struct bufferevent *bufev, void *data, size_t size);

**

服务端

**

#include <string.h>
#include <iostream>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <event2/event.h>
#include <event2/bufferevent.h>
#include <event2/listener.h>
using namespace std;

//读回调
void read_cb(struct bufferevent *bev, void *arg){
    //读缓冲区中的数据
    char buf[1024] = {0};
    bufferevent_read(bev, buf, sizeof(buf));
    cout << "收到: " << buf;

    char pt[] = "我是read_cb, 你发送的数据我收到了!";
    //往缓冲区写数据
    bufferevent_write(bev, pt, strlen(pt) + 1);
    cout << "我是read_cb, 我往缓冲区写数据了!" << endl;
}

//写回调
void write_cb(struct bufferevent *bev, void *arg){
    cout << "我是write_cb,数据已经发送了" << endl << endl;
}

//事件回调
void event_cb(struct bufferevent *bev, short events, void *arg){
    if(events & BEV_EVENT_EOF){
        cout << "连接关闭" << endl;
    }
    else if(events & BEV_EVENT_ERROR){
        cout << "其他错误" << endl;
    }
    //释放资源
    bufferevent_free(bev);
}

void listen_cb(struct evconnlistener *listener,
               evutil_socket_t fd,
               struct sockaddr *addr,
               int len, void *ptr)
{
    //得到传进来的event_base
    struct event_base* base = (struct event_base*)ptr;
    
    //先接受数据 - 发送数据
    //将fd封装为bufferevent
    struct bufferevent* bev = NULL;
    bev = bufferevent_socket_new(base, fd, BEV_OPT_CLOSE_ON_FREE);
    
    //给bufferevent对于的读写缓冲区设置回调函数
    bufferevent_setcb(bev, read_cb, write_cb, event_cb, NULL);
    
    //设置读缓冲区的回调函数可用, 默认写是可用的
    bufferevent_enable(bev, EV_READ);
}

int main(){
    struct event_base* base = event_base_new(); //创建事件处理框架

    //初始化
    struct sockaddr_in serv;
    memset(&serv, 0, sizeof(serv));
    serv.sin_family = AF_INET;
    serv.sin_port = htons(8765);
    serv.sin_addr.s_addr = htonl(INADDR_ANY);

    /*
     evconnlistener_new_bind函数的功能有下面三个 
     1.创建套接字
     2.绑定
     3.开监听
    */
    //参数分别为: base,回调函数(自己写),回调函数传参,flags,backlog,服务端信息,socklen 
    struct evconnlistener* listen = evconnlistener_new_bind(base, listen_cb, base, 
                                                            LEV_OPT_CLOSE_ON_FREE | LEV_OPT_REUSEABLE,
                                                            -1, (struct sockaddr*)&serv, sizeof(serv));

    //开启事件循环
    event_base_dispatch(base);

    //释放资源
    evconnlistener_free(listen);
    event_base_free(base);

    return 0;
}

**

客户端:

**

#include <string.h>
#include <iostream>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <arpa/inet.h>
#include <event2/event.h>
#include <event2/bufferevent.h>
using namespace std;

//读回调
void read_cb(struct bufferevent* bev, void* arg){
    //接收数据
    char buf[1024] = {0};
    bufferevent_read(bev, buf, sizeof(buf));
    cout << "我是read_cb, 我读到: " << buf;
    cout << "数据已经发送完成!" << endl << endl;
}

//写回调
void write_cb(struct bufferevent* bev, void* arg){
    cout << "我是write_cb, 我已经写完数据了" << endl;
}

void event_cb(struct bufferevent* bev, short events, void* arg){
    if(events & BEV_EVENT_EOF){
        cout << "连接关闭!" << endl;
    }
    else if(events & BEV_EVENT_ERROR){
        cout << "其他错误!" << endl; 
    }
    else if(events & BEV_EVENT_CONNECTED){
        cout << "连接服务器成功!" << endl;
        return;
    }
    bufferevent_free(bev);
    return;
}

void read_terminal(int fd, short what, void* arg){
    // 读终端的数据
    char buf[1024] = {0};
    int len = read(fd, buf, sizeof(buf));
    
    struct bufferevent* bev = (struct bufferevent*)arg;
    // 将数据发送给服务器
    bufferevent_write(bev, buf, len + 1);
}
int main(){
    //创建一个事件处理框架
    struct event_base* base = event_base_new();

    //创建事件
    int fd = socket(AF_INET, SOCK_STREAM, 0);
    struct bufferevent* bev = bufferevent_socket_new(base, fd, BEV_OPT_CLOSE_ON_FREE);
    //连接服务器
    sockaddr_in serv = {0};
    serv.sin_family = AF_INET;
    serv.sin_port = htons(8765);
    inet_pton(AF_INET, "127.0.0.1", &serv.sin_addr.s_addr);
    bufferevent_socket_connect(bev, (struct sockaddr*)&serv, sizeof(serv));
    //给缓冲区设置回调函数
    bufferevent_setcb(bev, read_cb, write_cb, event_cb, NULL);
    bufferevent_enable(bev, EV_READ);

    // 往终端输入数据,然后发送到缓冲区给服务器读
    // 创建一个终端输入的新事件
    struct event* ev = event_new(base, STDIN_FILENO, EV_READ | EV_PERSIST, 
                                 read_terminal, bev);
    event_add(ev, NULL); //添加新事件到事件处理框架
  
    //启动事件循环
    event_base_dispatch(base);

    //释放资源
    event_base_free(base);
    
    return 0;
}

**

Makefile

**

all:server.out client.out

server.out:server.cpp
		g++ server.cpp -g -o server.o -levent

client.out:client.cpp
		g++ client.cpp -g -o client.o -levent

clean:
	rm -rf server.o
	rm -rf client.o

执行结果
在这里插入图片描述

总结

libevent提供了一系列接口,其底层原理是epoll,可以支持并发,大致使用流程为:
在这里插入图片描述
需要注意的一点是,只要使用bufferevent_socket_new( )去创建事件,要给缓冲区设置回调函数,作为bufferevent_setcb( )的参数(上面代码有体现)。

在linux下C语言通过libevent操作串口 在linux下C语言通过libevent操作串口,通过libevent来实现回调读取串口数据。全部C代码,可直接编译和测试。 立即下载

相关推荐

tcp转串口,使用libevent

在ubuntu里面使用 libevent 实现,作为

linux libevent-多线程使用bufferevent,解决多线程调用bufferevent_write方法后消息发送不出去的问题

最近在使用libevent的时候发现多线程调用bufferevent_write的时,在一段时间后经常会发送不出数据。后来在研究发现是默认情况下bufferevent是在主线程中使用的,多线程调用时线程不安全。 解决问题如下: (1)直接添加“BEV_OPT_THREADSAFE”后创建bufferevent不成功问题 (2)添加evthread_use_pthreads()方法后编译时提示:“evthread_use_pthreads 未定义的引用”的问题 (3)多线程调用发送消息后经常出...

shang3583091的博客 2345

【人工智能】人工智能基础概念、流派、发展史

人工智能初衷就是让计算机能够像人类一样具有自我思考、自我学习、自我决策的能力。依据百度百科上对人工智能定义:人工智能是研究、开发用于模拟、扩展和延伸人的智能的理论、方法、技术及应用系统的一门新的技术学科。人工智能是研究使计算机来模拟人的某些思维过程和智能行为的学科,主要包括计算机实现智能的原理、制造类似于人脑智能的计算机,使计算机能实现更高层次的应用。

WEL测试 1878

Libevent群:很值得体会的多线程编程

/* This exmple program provides a trivial server program that listens for TCP connections on port 9995. When they arrive, it writes a short message to each client connection, and closes each co

nedushy123的专栏 2368

计算机视觉——多视图几何

多视图几何1.前言1.1 多视图几何概念2. 基本原理2.1 对极几何2.2 基础矩阵2.2.1 基础矩阵推导2.2.2 求解基础矩阵3. 实验过程3.1 实验数据准备3.2 实验代码3.3 实验结果及分析4. 实验中遇到的问题 1.前言 1.1 多视图几何概念 多视图几何是利用在不同视点所拍摄图像间的关系,来研究照相机之间或者特征之间关系的一门科学。 多视图几何(Multiple View ...

RuiMa的博客 7715

高通量测序数据分析:RNA-seq

深度测序相关数据库与数据格式 SRA toolkit 一、NCBI 和EBI、DDBJ组成INSDC,数据内容相同所以找NCBI就行。 (一)NCBI常用数据库 GenBank:遗传序列数据库,收集了所有公开的DNA序列及其注释 GEO (Gene Expression Omnibus) :收集整理各种表达芯片数据,后来加入了甲基化、lncRNA、miRNA、CNV等其他芯片,还有高通量测序数据...

qq_41134363的博客 3万+

libevent中bufferevent事件及常用的API函数

bufferevent实际上也是一个event,只不过比普通的event高级,他的内部有两个缓冲区,以及一个文件描述符(网络套接字)。一个网络套接字有读写两个缓冲区,bufferevent同样也带有两个缓冲区。所以有四个缓冲区。

luosuss的博客 1669

【feature_column处理】- indicator_column(指示列)和embedding_column(嵌入列)

1. 开胃菜 我们先来了解一下tf.feature_column.input_layer def input_layer(features, feature_columns, weight_collections=None, trainable=True, cols_to_vars=None, cols_to_output_tensors=None)

DataAlgo 1485

Linux C开发 - UART+libevent

libevent在arm系列设备中的串口应用例子

qq_27842763的博客 733

电路研究9.4——合宙Air780EP的LuatOS、CSDK跟标准AT

 C-SDK、AT指令、LuatOS

esmember的博客 1116

华为OD机考双机位C卷 - 文件存储系统的排序(Java & Python & JS & GO & C++ & C)

华为OD机考双机位C卷 - 文件存储系统的排序, 提供Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。

算法大师! 778

linux_libevent框架

libevent网络库的简单应用

Liangheng_梁衡的博客 671

论文必备 - YOLO26热力图可视化,支持指定模型,指定显示层,设置置信度,以及9种可视化实现方式

本文带来的是YOLO26热力图可视化功能,支持指定模型,指定显示层,设置置信度,以及9种可视化实现方式。我们经常看到一些论文里绘制了不同的热力图,一方面能够直观的感受其模型的有效性,另一方面也丰富了论文内容。特别是在使用了注意力模块的网络中,热力图就可以验证注意力机制是否真正聚焦到了预期的重要特征上,以便对模型的有效性和合理性进行评估。例如Centralized Feature Pyramid for Object Detection这篇文章中展示的,就很能够表达作者改进后的模型相比之前模型的优越性。在项目

Limiiiing的博客 429

libevent实现TCP通信

翻阅了整个优快云,居然没有一个用libevent采用bufferevent实现TCP通信的程序是真的能跑下来的,要么是客户端没开读缓冲,要么是客户端读回调居然还往缓冲里写,简直就是妖魔鬼怪,误人子弟。以下是基于黑马程序员Linux网络通信基于libevent采用bufferevent实现TCP通信完成大小写转换,可供参考很成功!

bblb的博客 1658

老版QQ原生表情gif动态

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

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

libevent框架的使用

一、概述 1. LAMP - web服务器套件 LAMP:它是一个缩写,指一组通常一起使用来运行动态网站或者服务器的自由软件。 LAMP展开 缩写 展开 说明 L Linux 操作系统 A Apache 网页服务器 M MySQL 数据库管理系统(或数据库服务器) P PHP Perl或Python - 脚本语言 C10K:并发能力突破不了1万连接。 2. libevent 框架 libevent是一个轻量级

星辰的博客 821

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

libevent测试

#include #include #include #include "event2/event.h" #include "event2/buffer.h" #include "event2/http.h" #include "event2/http_struct.h" #include "event2/keyvalq_struct.h" // (default) #define HT

奋斗的小鸟 1256

精雕软件(JDpaint) 5.5 绿色版

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

libevent学习之二:Windows下编译libevent

Linux下编译参考源码中的README文件即可,这里主要记录Windows下的编译。一.准备工作去官网下载最新的稳定发布版本libevent-2.0.22-stable官网地址:http://libevent.org/二.使用VS2012编译1.解压libevent到C:\Users\zhang\Desktop\libevent-2.0.22-stable2.打开“VS2012开发人员命令提示”.........

草上爬的博客 8691

基于libevent的多线程通信框架实现

很久没有写博客了,这半年多时间一直很忙,一直没有更新博客,今天心血来潮准备做一篇,刚好把最近的新研究东西拿出来给大家分享一下!自己以前的一个后台程序框架(应用于了很多应用项目,运营商***拦截系统,国内某视频聊天应用的后台系统等),里面的网络部分基于ACE来实现的,最近准备淘汰ACE,大部分组件功能打算重写,所以基于网络这块打算用libevent来实现,在做的过程中发现了一些问题,就...

sin@ 1万+

01libevent库的下载与安装并且测试是否安装成功

01libevent库的下载与安装并且测试是否安装成功 libevent库的优点 开源,精简,跨平台(Linux,Windows,Max…),专注于网络通信。 以下的步骤都是基于LInux。 1 下载与安装并且测试是否安装成功 1)先从官网下载安装包到你想要的目录。参考README。 2) 解压 tar -zxvf xxx.gz 3)检测安装环境,例如内存空间是否足够,生成makefile ./configure 4)生成.o文件和可执行文件 make 5)将必要的资源安装到系统的指定目录 s

weixin_44517656的博客 2171

【鸿蒙实战】OpenHarmony网络协议通信—libevent [GN编译] - 事件通知库

在/developtools/bytrace_standard/ohos.build文件中添加修改 “//third_party/libevent:libevent_targets”,“//third_party/libevent:libevent_test”out/rk3568/developtools/profiler(该路径生成库文件)out/rk3568/common/common (该路径生成生成可执行测试文件)将该结构添加到受监控事件列表中,只要事件结构处于活动状态,它就必须保持分配状态。

2401_88547687的博客 846

OpenHarmony网络协议通信—libevent [GN编译] - 事件通知库

在/developtools/bytrace_standard/ohos.build文件中添加修改 “//third_party/libevent:libevent_targets”,“//third_party/libevent:libevent_test”out/rk3568/developtools/profiler(该路径生成库文件)out/rk3568/common/common (该路径生成生成可执行测试文件)将该结构添加到受监控事件列表中,只要事件结构处于活动状态,它就必须保持分配状态。

achenbusi的博客 926

04libevent库下fifo作为通信的套接字

04libevent库下fifo作为通信的套接字 前言:这里为什么要准备这个例子是要说明libevent库不只只能用在网络通信当中即socket返回的fd;也可以用在本地返回的套接字,例如现在要说的fifo返回的本地套接字fd,此外本地套接字还可以是文件、mmap、信号等等。 理解下面代码的前提: 1)管道:管道是一个单向的数据流动,一边是读的话,另一边肯定是写。 2)读端创建了管道后,当前路径会有一个管道文件名,并且写端不需要在创建,只需要打开即可。 3)测试时,先启动读端,因为我们在代码上控制是读端中创

weixin_44517656的博客 355

libevent基础:用libevent写服务端server程序和客户端client程序

最近在进行一个基于libevent的项目,需要对libevent在socket通讯上的性能进行测试,写了这个简易的server和client程序,这也是libevent的基础,希望对大家了解libevent有所帮助。 server.c /************************************ * For msmr * server.c * tesing th

1万+

为 libevent 贡献代码:checkpatch 代码风格检查与 tinytest 回归测试实践指南

本篇指南以 [CONTRIBUTING.md](https://link.gitcode.com/i/14b28ecfc82f4aa378dbad553d51e2de) 为骨架,系统讲解向 libevent(事件通知库)提交代码的完整协作流程:如何遵循项目代码风格、如何用仓库自带的 [checkpatch.sh](https://link.gitcode.com/i/2394e6870921ce5

gitblog_01061的博客 1045
上一篇: 解决winscp只能下载,无法上传的问题
下一篇: minixml开源库的使用
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值