从一万英尺外看libevent

libevent是一个可以写快速、可移植、非阻塞的网络IO库,设计目标为:

  • 可移植性

    一个用libevent写的程序可以跨所有libevent支持的平台,即使是没有高效的方式实现非阻塞IO,libevent也支持普通的方式,以便你的程序在受限的环境中运行。

  • 速度

    libevent尝试在每个平台上用最快的非阻塞IO实现,而且并不会为此带来额外的开销。

  • 便利

    只要有可能,使用libevent编写的程序自然是稳定的,可移植的。

libevent划分为以下组件:

  • evutil

    为跨平台抽象出来的通用工具函数。

  • event和event_base

    这是Libevent的核心。它为各种特定于平台的、基于事件的非阻塞 IO 后端提供抽象 API。它可以让您知道socket何时准备好读取或写入、执行基本超时功能以及检测操作系统信号。

  • bufferevent

    这些函数为libevent基于事件的核心提供了更便利的封装接口,它让应用程序对缓冲区进行读取和写入,而不是通知您socket可以读取,让你知道IO何时实际发生。

  • evbuffer

    该模块为bufferevents的底层缓冲实现,提供了高效便利的访问。

  • evhttp

    一个简单的HTTP客户端/服务端实现

  • evdns

    一个简单的dns客户端/服务端实现

  • evrpc

    一个简单的RPC实现

当编译libevent的时候,默认安装以下库:

  • libevent_core

    所有核心事件、缓冲区功能。这个库包含了event_base、evbuffer、bufferevent和工具函数。

  • libevent_extra

    一些你可能需要,也可能不需要的基于特定协议的功能,包括HTTP、DNS和RPC。

  • libevent

    因为历史原因而存在,包含了libevent_core和libevent_extra,你不应该再使用这个库,在未来可能会取消这个库。

  • libevent_pthreads

    基于pthreads的线程、锁的可移植实现。它独立于libevent_core,如果你不需要以多线程的方式使用libevent的话,就不需要链接此库。

  • libevent_openssl

    这个库使用bufferevents和OpenSSl来对通信进行加密。它独立于libevent_core,如果你不需要使用加密连接,就不需要链接此库。

头文件

所有公开的头文件位于event2目录下,可以划分为3大类:

  • API头文件

    API头文件定义了公开的接口,这些头文件没有特殊的后缀。

  • 兼容性头文件

    包含一些已经弃用函数的定义,除非你从旧版本的libevent移植程序,否则你不应该使用这些文件。

  • 结构体头文件

    这些头文件定义了容易变动的结构。其中一些是公开的,以便于需要快速访问结构内容;有些是由于历史原因而暴露的。直接依赖头文件中的任何结构可能会破坏程序与其他版本的libevent的二进制兼容性,有时会导致难以调试的问题。这些头文件的后缀是_struct.h

如果你必须用旧版本的libevent

Libevent 2.0 对其 API 进行了修改,使其总体上更加合理且不易出错。如果可能,您应该编写新程序来使用 Libevent 2.0 API。但有时您可能需要使用较旧的 API,要么更新现有应用程序,要么支持由于某种原因无法安装 Libevent 2.0 或更高版本的环境。

旧版本的 Libevent 具有较少的头文件,并且没有将它们放在event2目录下:

旧头文件替代的新的头文件
event.hevent2/event.h, event2/buffer.h event2/bufferevent.h event2/tag.h
evdns.hevent2/dns*.h
evhttp.hevent2/http*.h
evrpc.hevent2/rpc*.h
evutil.hevent2/util*.h

标签: libevent

添加新评论