前言

ReactorDouglas C. Schmidt提出的一种设计模式,翻译为反应器模式,或者分发器模式。很多开源的项目都使用了此设计模式,如muduoRedisNginxNetty

本文假定读者有一定的C/C++的网络编程经验,并且对IO多路复用有一定的了解,如selectpollepoll等函数。

本文主要面向对Reactor有一定了解,但是并不知道C++类应该如何设计的读者。

- 阅读剩余部分 -

Libevent 的 evbuffer 功能实现了一个字节队列,针对将数据添加到末尾和从前面删除数据进行了优化。

Evbuffers 通常用于执行缓冲网络 IO 的“缓冲”部分。它们不提供调度 IO 或在 IO 准备好时触发 IO 的功能:这是 bufferevents 所做的功能。

- 阅读剩余部分 -

这一章节讲述一些bufferevent的高级特性,对初学者来说并不是必须的。如果你刚刚学习如何使用bufferevent,可以跳过本章节。

成对的bufferevent

有时,你需要编写一个与自己通信的网络程序。例如,您可以编写一个程序来通过某个协议建立隧道用户连接,而该程序有时也希望通过该协议建立自己的连接隧道。当然,您可以通过打开与您自己的侦听端口的连接并让您的程序使用自己来实现这一点,但是,让您的程序通过网络堆栈与自己对话会浪费资源。

相反,您可以创建一对成对的bufferevent,以便写入一个的所有字节都被另一个接收(反之亦然),但不使用socket。

- 阅读剩余部分 -

大多数时候,除了响应事件之外,应用程序还希望执行一些数据缓冲。例如,当我们想要写入数据时,通常的模式运行如下:

  • 决定我们要向连接写入一些数据;将该数据放入缓冲区。
  • 等待连接变为可写
  • 尽可能多地写入数据
  • 记住我们写了多少,如果我们还有更多的数据要写,等待连接再次变为可写。

- 阅读剩余部分 -

事件

event是libevent的基本操作单元,每一个event代表一系列条件的集合,包括:

  • 一个文件描述符准备好了读、写
  • 一个文件描述符准备好了读、写(仅限于边缘触发)
  • 超时到期
  • 发生了信号
  • 用户触发的事件

- 阅读剩余部分 -

大多数编程初学者使用的是阻塞的IO函数调用,也称为同步IO,当你调用它的时候,除非函数操作完成或者函数超时然后网络栈放弃的时候才会返回。举个例子,当你在TCP连接上调用connect()的时候,操作系统发送一个SYN数据包至对方主机,除非接收到了对方主机返回的SYN,ACK数据包才会返回至你的代码控制流程,或者是超时了,系统决定放弃的时候也会返回。

- 阅读剩余部分 -

大学时,我就想搭一个自己的博客。但觉得自己技术不够,这个念头便一直搁置着。

毕业后的头几年,这个想法又冒出来了。也曾尝试用 Django 搭建过一个博客,部署在 VPS 上,却终究没能坚持下去。

如今,我重新搭建了博客。回头想想,大概有以下几个原因:

- 阅读剩余部分 -