Evbuffers:缓冲IO的功能
Libevent 的 evbuffer 功能实现了一个字节队列,针对将数据添加到末尾和从前面删除数据进行了优化。
Evbuffers 通常用于执行缓冲网络 IO 的“缓冲”部分。它们不提供调度 IO 或在 IO 准备好时触发 IO 的功能:这是 bufferevents 所做的功能。
Libevent 的 evbuffer 功能实现了一个字节队列,针对将数据添加到末尾和从前面删除数据进行了优化。
Evbuffers 通常用于执行缓冲网络 IO 的“缓冲”部分。它们不提供调度 IO 或在 IO 准备好时触发 IO 的功能:这是 bufferevents 所做的功能。
这一章节讲述一些bufferevent的高级特性,对初学者来说并不是必须的。如果你刚刚学习如何使用bufferevent,可以跳过本章节。
有时,你需要编写一个与自己通信的网络程序。例如,您可以编写一个程序来通过某个协议建立隧道用户连接,而该程序有时也希望通过该协议建立自己的连接隧道。当然,您可以通过打开与您自己的侦听端口的连接并让您的程序使用自己来实现这一点,但是,让您的程序通过网络堆栈与自己对话会浪费资源。
相反,您可以创建一对成对的bufferevent,以便写入一个的所有字节都被另一个接收(反之亦然),但不使用socket。
大多数时候,除了响应事件之外,应用程序还希望执行一些数据缓冲。例如,当我们想要写入数据时,通常的模式运行如下:
<event2/util.h>头文件定义了许多函数,您可能会发现这些函数对使用 Libevent 实现可移植应用程序很有帮助。 libevent 在内部使用这些类型和函数。
event是libevent的基本操作单元,每一个event代表一系列条件的集合,包括:
在你使用libevent的函数之前,你应该先创建一个或多个event_base结构,每一个event_base拥有event集合,并且轮询它们看哪个处于active状态。
大多数编程初学者使用的是阻塞的IO函数调用,也称为同步IO,当你调用它的时候,除非函数操作完成或者函数超时然后网络栈放弃的时候才会返回。举个例子,当你在TCP连接上调用connect()的时候,操作系统发送一个SYN数据包至对方主机,除非接收到了对方主机返回的SYN,ACK数据包才会返回至你的代码控制流程,或者是超时了,系统决定放弃的时候也会返回。
这篇文档会教你如何使用libevent2.0(或者更新的版本)来写快速的、可移植的网络编程,假设你: