libevent简要介绍

article/2025/9/10 13:05:49
libevent库
开源。精简。跨平台(Windows、Linux、Maxos、unix)。专注于网络通信。
源码包安装:
./configure                    检查安装环境  生成makefile
make                                生成.o和可执行文件
sudo  make  install        将必要的资源cp至系统指定目录。
进入sample目录,运行demo验证库安装使用情况。
编译使用库的.c时,需要加-levent选项。
库名libevent.so--> /usr/local/lib    查看得到。
特性:
基于“事件”异步通信模型。---回调。
libevent框架:
  1.  建event_base        (乐高底座)
struct event_base *event_base_new(void);
struct event_base *event *base=event_base_new();
    2.  创建 事 件event
常规事件 event    -->event_new();
bufferevent -->bufferevnet_socket_new();
    3. 将事件  添加到base上
int event_add(struct event *ev,const struct timeval *tv);
 4. 循环监听事件满足
int event_base_dispatch(struct event_base *base);
event_base_dispatch(base);
 5. 释放 event_base
event_base_free(base);
创建事件:
struct event *ev;
struct event *evennt_new(struct event_base *base,evutil_socket_t fd,short what,event_callback_fn cb;void *arg);base:event_base_new()返回值。fd :绑定到event上的 文件描述符。what:对应的事件(r、w、e)EV_READ            一次  读事件EV_WRTIE           一次 写事件EV_PERSIST        持续触发。结合event_base_dispatch函数使用,生效。cb:一旦事件满足监听条件,回调的函数。typedef void(*event_callback_fn)(evutil_socket_t fd, short,void *)arg:回调函数的参数。返回值:成功创建的 event

添加事件到event_base
int event_add(struct event *ev,const struct timeval *tv);ev: event_new()的返回值。tv:NULL

从event_base上摘下事件                【了解】
int event_del(struct event *ev);ev:event_new()的返回值。

销毁事件:       
int event_free(struct event *ev);ev:event_new()的返回值。

未决和非未决:
非未决:没有资格被处理
未决:有资格被处理,但尚未被处理
event_new--->event---->非未决--->event_add--->未决--->dispatch()&&监听事件被触发-->激活态
——>执行回调函数--->处理态--->非未决 event_add && EV_PERSIST---->未决--->event_del--->非未决
带缓冲区的事件 bufferevent
 #include<event2/buffereevent.h>
创建、销毁bufferevent 
struct bufferent *ev;
struct bufferevent *bufferevent_socket_new(struct event_base *base,evutil_socket_t fd,enum bufferevent_options options);base:    event_basefd:    封装到bufferevent内的fdoptions:    BEV_OPT_CLOSE_ON_FREE
返回:成功创建的bufferevent事件对象。
void bufferevent_socket_free(struct bufferevent *ev);
给bufferevent设置回调:
对比event:event_new(fd,callback);            event_add() --- 挂到event_base上。bufferevent_socket_new(fd)        bufferevent_setcb(callback)void bufferevent_setcb(struct bufferevent*bufev, bufferevent_data_cb reacb, bufferevent_data_cb writecb, bufferevent_data_cb eventcb , void *cbarg );bufev:bufferevent_socket_new()返回值
readcb:设置bufferevent 度缓冲,对应回调 read_cb{     bufferevent_read()  读数据   }
writecb:设置bufferevent 写缓冲,对应回调write_cb{    } ---给调用者,发送写成功通知。    可以NULLeventcb:设置事件回调。    也可以传NULLtypedef void(*bufferevent_data_cb)(struct bufferevent *bev,void*ctx);void event_cb(struct bufferevent *bev, short events, void *cbarg){。。。。。}
cbarg:上述回调函数使用的参数。
read    回调函数类型:typedef void(*bufferevent_data_cb)(struct bufferevent *bev,void*ctx);void read_cb(struct bufferevent *bev,void *cbarg){.....bufferevent_read();    ---read()}
bufferevent_read()函数的原型:size_t bufferevent_read(struct bufferevent *bev, void *buf, size_t bufsize);write 回调函数类型:int bufferevent_write(struct bufferevent *bufev, const void*data,size_t size);
启动、关闭bufferevent的 缓冲区:
 void bufferevent_enable(struct bufferevent *bufev, short events);    启动events:    EV_READ、EV_WRITE、EV_READ|EV_WRITE默认、write 缓冲区 enable、read缓冲区是disablebufferent_enable(event,EV_READ);            --开启读缓冲

创建监听服务器:
socket();bind();listen();accept();
struct evconnlistener *listner
struct evconnlistener *evconnlistener_new_bind(struct event_base *base,evconnlistener_cb cb,void *ptr,unsigned flags,int backlog,const struct sockaddr *sa,int socklen);base:event_base
cb:回调函数。    一旦被回调,说明在其内部应该与客户端完成,数据读写操作,进行通信。
ptr:回调函数的参数
flags:LEV_OPT_CLOSE_ON_FREE |  LEV_OPT_REUSEABLE
backlog:listen() 2参。    -1表最大值
sa:服务器自己的地址结构体
socklen:服务器自己的地址结构体大小。
返回值:成功创建的监听器。
连接客户端:
socket();    connect();
int bufferevent_socket_connect(struct bufferevent *bev, struct sockaddr *address, int addrlen);bev:bufferevent 事件对象(封装了fd)address、len:等同于connect()参2/3

服务器端libevent创建TCP连接:
  • 1.创建event_base
  • 2.创建bufferevent事件对象。bufferevent_socket_new();
  • 3.使用bufferevent_setcb()函数给bufferevent的read、write、event设置回调函数。
  • 4.当监听的事件满足时,read_cb会被调用,在其内部bufferevent_read();    读
  • 5.使用evconnlistener_new_bind创建监听服务器,设置其回调函数,当有客户端成功连接时,这个回调函数会被调用。
  • 6.封装listner_cb()在函数内部。完成与客户端通信。
  • 7.设置读缓冲、写缓冲的 使能状态 enable、disable
  • 8.启动循环event_base_dispath();
  • 9.释放连接
客户端libevent创建TCP连接:
  • 1.创建event_base
  • 2.使用bufferevent_socket_new()创建一个用跟踪服务器通信的bufferevnet事件对象
  • 3.使用bufferevent_socket_connect()连接 服务器
  • 4.使用bufferevent_setcb()给bufferevnet对象的read、write、event设置回调
  • 5.设置bufferenet对象的读写缓冲区enable/disable
  • 7.启动循环event_base_dispath();
  • 8.释放连接

web——HTTP请求协议:
  • 1.getline()获取http协议的第一行。
  • 2.从首行中拆分    GET、文件名、协议版本。获取用户请求的文件名。
  • 3.判断文件是否存在。stat()
  • 4.判断是文件还是目录。
  • 5.是文件--open--read --写会给浏览器
  • 6.先写http应答协议头:http/1.1 200 ok
  • 7.写文件数据。

 


http://chatgpt.dhexx.cn/article/r3cFvI4S.shtml

相关文章

Libevent库的简介

一、libevent是什么 Libevent 是一个用C语言编写的、轻量级的开源高性能事件通知库&#xff0c;主要有以下几个亮点&#xff1a;事件驱动&#xff08; event-driven&#xff09;&#xff0c;高性能;轻量级&#xff0c;专注于网络&#xff0c;不如 ACE 那么臃肿庞大&#xff1b…

libevent库学习(1)

一、初识 1、libevent介绍 Libevent 是一个用C语言编写的、轻量级的开源高性能事件通知库&#xff0c;主要有以下几个亮点&#xff1a;事件驱动&#xff08; event-driven&#xff09;&#xff0c;高性能;轻量级&#xff0c;专注于网络&#xff0c;不如 ACE 那么臃肿庞大&…

详解Libevent网络库

项目中要用到libevent&#xff0c;所以就自学了libevent&#xff0c;参考资料为张亮的《libevent源码深度剖析》和《linux高性能服务器编程》 Libevent简介 Libevent是开源社区一款高性能的I/O框架库&#xff0c;其具有如下特点&#xff1a; 1.跨平台支持。Libevent支持Linu…

Libevent库的介绍与应用

Libevent库 Libevent概述Libevent使用模型Libevent库使用示例Libevent事件类型和框架结构使用Libevent完成tcp服务端 Libevent概述 Libevent是开源社区的一款高性能的I/O框架库&#xff0c;使用Libevent的著名案例有&#xff1a;高性能的分布式内存对象缓存软件memcached,Goog…

Linux c 开发 - libevent

目录 一、event_base 1. 创建event_base 2. 查看IO模型 3. 销毁event_base 4. 事件循环 event loop 5. event_base的例子 二、event 事件 1. 创建一个事件event 2. 释放event_free 3. 注册event 4.event_assign 5. 信号事件 6. event细节 三、Socket实例 四、Bu…

安装svn客户端

下载地址 下载 TortoiseSVN 我的网盘地址&#xff1a; 百度网盘 请输入提取码 提取码&#xff1a; em9s 1、安装客户端 双击运行&#xff1a; 点击【next】 点击【next】 选择好路径后&#xff0c;点击【next】 点击【install】安装 点击【finish】完成安装。安装完成后重…

SVN客户端配置--客户端

一、使用客户端软件连接SVN服务器 在项目文件夹中单击右键–>TortoiseSVN–>Repo-browser,并在弹出框中贴入URL&#xff08;svn://服务器IP&#xff09; 在图中指定的位置单击右键选择checkput 点击OK点击OK SVN的三大指令 指令名称Checkout①连接到SVN服务器②更新服务…

SVN客户端(TortoiseSVN)安装及使用说明

&#x1f60a; 作者&#xff1a; 一恍过去 &#x1f496; 主页&#xff1a; https://blog.csdn.net/zhuocailing3390 &#x1f38a; 社区&#xff1a; Java技术栈交流 &#x1f389; 主题&#xff1a; SVN客户端(TortoiseSVN)安装及使用说明 ⏱️ 创作时间&#xff1a; 20…

ubuntu搭建SVN客户端,右击提交或更新

有时候我们会在Linux系统上搞开发&#xff0c;项目在SVN上&#xff0c;不搭建SVN环境搞起来比较麻烦&#xff0c;不用其他软件为载体实现右击提交更新等其他操作&#xff0c;不使用VsCode,IDE全家桶等为载体搭建插件形式的SVN&#xff0c;完全独立搭建 1&#xff1a;安装SVN客…

SVN客户端下载及安装

SVN客户端地址&#xff1a;https://osdn.net/projects/tortoisesvn/# 方法/步骤 官网下载tortoisesvn&#xff0c;下载完成之后&#xff0c;如下图所示&#xff1a; 点击安装进入安装界面&#xff0c;点击接受协议&#xff0c;如下图所示&#xff1a; 选择安装的地址&…

【转】Ubuntu中SVN客户端安装+使用

转自&#xff1a;Ubuntu中SVN客户端安装使用_三少GG-CSDN博客 1、 安装 svn客户端&#xff1a; apt-get install subversion&#xff0c;然后根据提示一步一步&#xff0c;就完成了 svn的安装。当然&#xff0c;也可以源码安装 svn&#xff0c;下载 subversion 一个最新版本的源…

SVN客户端

SVN是Subversion的简称&#xff0c;是一个开源的代码版本控制系统 SVN客户端操作 checkout 检出&#xff1a;初次下载-第一次连接svn服务器时候需要下载对应仓库的数据&#xff08;如果仓库中有数据的话&#xff09;add 新增&#xff1a;新增数据到svn服务器update 更新&#x…

【SVN】windows下的SVN客户端访问ubuntu下的SVN服务器

目录 第一部分 windows创建本地版本库、连接ubuntu的SVN服务器 步骤0&#xff1a; 步骤一&#xff1a;创建windows本地版本库 步骤二&#xff1a;checkout检测 步骤三&#xff1a;输入之前配置的用户名和密码 第二部分 windows上传文件至SVN服务器 步骤一&#xff1a;添加…

SVN 客户端下载与安装

SVN 客户端下载与安装 svn 客户端下载地址&#xff1a;https://tortoisesvn.net/downloads.zh.html 1. 网址截图 2. 汉化包下载安装 下载完毕&#xff0c;双击安装&#xff0c;下一步即可&#xff08;可根据需要进行安装路径选择&#xff09;

windows环境下的svn客户端(VisualSVN Server),服务端(TortoiseSVN),中文化(TortoiseSVN LanguagePack_1.9.7.2)安装和使用(超详细)

一、下载安装包 1.VisualSVN server 服务端下载&#xff1a;VisualSVN Server 2.svn客户端下载&#xff1a;TortoiseSVN 3.中文化包下载&#xff1a;TortoiseSVN LanguagePack_1.9.7.27907-x64-zh_CN中文包 二、安装软件 1.安装VisualSVN server 服务端&#xff1a; &#xf…

SVN客户端安装及操作文档

第一部分&#xff1a;客户端安装 1 在D盘创建svnclient文件夹&#xff0c;并将svn安装包复制到svnclient文件夹中 2 客户端安装 双击文件“TortoiseSVN-1.14.1.29085-x64-svn-1.14.1.msi” 点击“Next” 点击“Next” 点击“Browse”选择安装路径&#xff0c;这里将安装路径…

12306图片验证码效果实现

效果如下&#xff1a; 原理&#xff1a;从服务器获取的图片上&#xff0c;我们画上自己的图片&#xff0c;然后再显示出来。 核心代码如下在处理imageview点击事件前做如下操作&#xff1a; Bitmap bitmap BitmapFactory.decodeResource(getResources(), R.mipmap.yanzheng)…

利用神经网络识别12306验证码—(六)模型应用以及12306实战测试

模型训练好之后&#xff0c;就可以应用于新图片的预测了。比如现在有下面这么一张12306的验证码&#xff0c;预测工作也分为两部分&#xff1a;上半部分的文字预测、下半部分的图片预测&#xff0c;将两部分划分开之后分别加载各自的模型进行预测。 文字预测&#xff1a;需要把…

php实现12306验证码,PHP仿12306图片验证码

生成验证码的demo使用模型model读取图库&#xff0c;有需要对接框架的朋友可以自己修改&#xff0c;如下&#xff1a; # 引入测试的数据库model require_once dirname(__FILE__)./Model.php; # 引入验证码核心类库 require_once dirname(dirname(__FILE__))./vendor/Vif.php; $…

python 爬取12306验证码

一个简单的验证码爬取程序 本文介绍了在Python2.7环境下爬取网站验证码&#xff1a; 思路就是获取验证码对应的url&#xff0c;然后发起requst请求&#xff0c;读取该URL对应的内容&#xff0c;然后写入到一个本地文件&#xff0c;实现一个验证码的保存。大量下载可以把以上程…