详解libevent网络库(一)---框架的搭建

libevent概述

Libevent 是一个用C语言编写的、轻量级的开源高性能事件通知库,主要有以下几个亮点:事件驱动( event-driven),高性能;轻量级,专注于网络,不如 ACE 那么臃肿庞大;源代码相当精炼、易读;跨平台,支持 Windows、 Linux、 *BSD 和 Mac Os;支持多种 I/O 多路复用技术, epoll、 poll、 dev/poll、 select 和 kqueue 等;支持 I/O,定时器和信号等事件;注册事件优先级。

Libevent 已经被广泛的应用,作为底层的网络库;比如 memcached、 Vomit、 Nylon、 Netchat等等。
链接-来自百度百科: https://baike.baidu.com/item/libevent/.

起源

起初对libevent、libev、libuv等网络库有所耳目,未能拜读,最近在开发公司项目的时,发现底层组件之间交互采用了libevent进行编写,遂对其学习研究。公司中采用libevent 2.0之前的版本进行研发,对比发现,旧版本中很多函数过于冗杂,现对libevent 2.0之后的新版本进行学习研究:

在Libevent2.0之前的版本中,没有event_assign或者event_new函数,而只有event_set函数,该函数返回的event与“当前”base相关联。如果有多个event_base,则还需要调用event_base_set函数指明event与哪个base相关联

获取源码

Github: https://github.com/libevent/libevent

初识libevent

只要是学习编程似乎都逃离不了“hello word”定律!(嗯…真香!)
编译安装libevent源码之后,进入文件sample cd /sample
接下来,我们可以看到libevent官方为我们提供的demo,
demo文件路径
vim打开hello-world.c文件查看示例代码。监听端口号
发现监听端口号为:9995
好,接下来我们开始libevent的奇妙之旅,
使用xshell启动两个本地连接,

  1. 服务端:在上述路径执行 ./hello-world
  2. 客户端:采用nc进行访问 nc 127.0.0.1 9995 9995为上述代码中指定的端口号
    demo启动
    每有客户端注册时 server端将打印 flushed answer,同时,client端打印Hello, World!

框架学习-- event_base 重中之重

翻读源码中有这样一句话:
The event_base lies at the center of Libevent; every application will have one.

夸张的理解为:libevent的世界中,event_base作为万物起源

使用 libevent 函数之前需要分配一个或者多个 event_base 结构体。每个event_base
结构体持有一个事件集合,可以检测以 确定哪个事件是激活的。(相当于epoll红黑树的树根

从思想上出发

  • 我们可以把libevent项目想象为造火箭的过程,我们都只是螺丝工,那么造火箭需要做什么?

1. 拿出火箭壳(创建框架)
2. 造螺丝 (创建事件)
3. 拧螺丝 (添加事件)
4. 造火箭(事件循环)

一:掏出火箭壳 —>event_base()创建与释放

我们开始第一步:创建一个event_base

// 创建event_base
struct event_base* event_base_new(void)

当然,作为一个优秀的c语言程序员(咳,我还是个菜),要在创建的同时考虑资源释放的问题,
在程序的最后我们需要 event_base_free 进行释放(但我们不得不提前考虑)

// 释放event_base_free
event_base_free(struct event_base* base);

二:造螺丝 —>event_new()创建与释放

注:创建事件:(当前篇只针对不带缓冲区event事件进行讲解,有关缓存学习请见后续更新)

// 创建新事件
	struct event *event_new(
		struct event_base *base, 
		evutil_socket_t fd, - // 文件描述符 - int  **底层是对epollin与epollout的封装**
		short what, 
		event_callback_fn cb, // 事件的处理回调函数
		void *arg //回调函数传参
); 
// 事件的处理回调函数
	typedef void (*event_callback_fn)(evutil_socket_t, short, void *); 
//	short what
	#define  EV_TIMEOUT         0x01    // 已淘汰(忽略&#x
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值