| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 系统运维 -> 使用libevent实现基于event的tcp服务器 -> 正文阅读 |
|
[系统运维]使用libevent实现基于event的tcp服务器 |
Libevent 介绍:Libevent 是一个用于编写快速可移植非阻塞 IO 的库。其设计目标为: 可移植性
速度
可扩展性
方便
?Libevent 的核心思想: 在linux系统上, 其实质就是epoll反应堆. libevent是事件驱动, epoll反应堆也是事件驱动, 当要监测的事件发生的时候, 就会调用事件对应的回调函数, 执行相应操作. 特别提醒: 事件回调函数是由用户开发的, 但是不是由用户显示去调用的, 而是由libevent去调用的. Libevent 的相关API介绍: struct event_base *event_base_new(void) 函数说明:event_base_new() 函数分配并返回具有默认设置的新事件库(event_base结构)。它检查环境变量并返回一个指向新 event_base 的指针。如果有错误,则返回 NULL。 void event_base_free( struct event_base *base)
函数说明:完成event_base后,释放event_base的指针。
int event_reinit( struct event_base *base)
函数说明:在调用 fork() 创建子进程之后,并非所有事件后端都保持干净。因此,如果程序使用 fork() 或相关系统调用来启动一个新进程,并且希望在子进程中继续使用 event_base,则可能需要重新初始化它。成功返回0, 失败返回-1。
对于不同系统而言, event_base就是调用不同的多路IO接口去判断事件是否已经被激活, 对于linux系统而言, 核心调用的就是epoll, 同时支持poll和select.
const char **event_get_supported_methods( void )
函数说明:event_get_supported_methods() 函数返回一个指向此版本 Libevent 中支持的方法名称数组的指针。数组中的最后一个元素为 NULL。
const char *event_base_get_method( const struct event_base *base)
函数说明:获得当前base节点使用的多路IO方法,调用返回 event_base 使用的实际方法的名称。?
int event_base_dispatch( struct event_base *base)函数说明:进入循环等待事件;调用该函数, 相当于没有设置标志位的event_base_loop(不常用的一种)。程序将会一直运行, 直到没有需要检测的事件了, 或者被结束循环的API终止。 int event_base_loopexit( struct event_base *base,const struct timeval *tv) int event_base_loopbreak( struct event_base *base) 函数说明:如果希望活动的事件循环在删除之前停止运行,可以调用两个略有不同的函数。event_base_loopexit() 函数告诉 event_base 在给定时间过去后停止循环。如果tv参数为 NULL,则 event_base 立即停止循环。 event_base_loopbreak() 函数告诉 event_base 立即退出其循环。 struct event *event_new(struct event_base *base, evutil_socket_t fd,short what, event_callback_fn cb,void *arg) typedef void (*event_callback_fn)(evutil_socket_t, short, void *)//回调函数 void event_free(struct event *event) 函数说明:event_new() 函数尝试分配和构造一个新事件以用于base。what参数是上面列出的一组标志。(它们的语义在下面描述)如果fd是非负数,它是我们将观察读取或写入事件的文件描述符。当事件处于活动状态时,Libevent 将调用提供的cb函数,将其作为参数传递:文件描述符fd 、触发的所有事件的位域以及构造函数时为arg传递的值。如果出现内部错误或无效参数,event_new() 将返回 NULL。所有新事件都已初始化且非挂起。要使事件挂起,请调用 event_add()(如下所述)。要解除分配事件,请调用 event_free()。 参数what指出要监听的一组事件: #define EV_TIMEOUT 0x01 //超时事件 #define EV_READ 0x02 //读事件 #define EV_WRITE 0x04 //写事件 #define EV_SIGNAL 0x08 //信号事件 #define EV_PERSIST 0x10 //周期性触发 #define EV_ET 0x20 //边缘触发 int event_add( struct event *ev, const struct timeval *tv) 函数说明:对非挂起事件调用 event_add 使其在其配置的基础中挂起。该函数在成功时返回 0,在失败时返回 -1。如果tv为 NULL,则添加事件而没有超时。否则,tv是以秒和微秒为单位的超时大小。 int event_del(struct event *ev) 函数说明:对已初始化的事件调用 event_del 使其处于非挂起和非活动状态。如果事件未挂起或未激活,则没有效果。返回值为 0 表示成功,-1 表示失败。 实现基于event的tcp服务器总体步骤: 1 搭建服务器的固定三步:
2 调用event_base_new函数创建event_base节点. 3 创建要监听的事件event, 主要就是监听事件和读数据的事件. ????????设置好监听事件的回调函数,然后event_add上树---->有新的连接, 则 调用accept接受新的连接---->将这个新的连接设置好回调函数(一般是设置读事件), 然后继续event_add上树, 若有客户端关闭连接则从树上摘除该事件节点. 4 调用event_base_dispatch进入循环等待事件的发生. 5 释放资源:调用event_base_free释放根节点和调用event_free释放事件节点. 实现如下:
执行服务端代码后,在其他终端窗口上同时使用nc命令进行测试: nc 127.1 8888, 多开几个终端窗口使用nc命令进行测试.? 测试结果如下: ?结果表明:服务端程序能同时接受多个客户端请求,实现了IO多路复用,提高了通信效率。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/15 9:59:46- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |