Reactor
介绍
Reactor模式网上有很多讲解,我这里不想过多介绍。其核心共有三个。
- 抽象的事件
- 事件多路分发器
- 一个Reactor用来管理整个流程
reactor by c
Reactor是我们从代码中抽取出来方便我们进行管理的。但这里我们完全不去管它。很暴力地使用面向过程的思想去做。
- 抽象的事件——直接被我们具体化为fd
- 事件多路分发器——直接被我们具体化为epoll
代码思路
服务器端的常规设置。socket-bind-listen,但要注意设置成为nonblock。
现在我们就得到了listenfd。我们希望当有客户连接到来的时候,其自动帮助我们去回调accept_conn函数。该怎么办呢?
借助epoll
epoll的作用是当文件描述符就绪的时候,通知epoll的使用者该文件描述符就绪。
很明显,我们将listenfd注册到epoll中后,当有连接到来时,epoll就会通知我们listenfd已经就绪。按照以前的思路,我们会去做一个if判断,如果返回的fd是listenfd就去调用accept_conn。如果是其它fd,就去做其它的事情。
但这里我们将利用回调函数的思想。当有事件就绪(即有fd就绪时候),我们无脑回调一个叫做call_back的函数。(很明显,这是一个函数指针)
int nfd = epoll_wait(g_efd, events, MAX_EVENTS + 1, 1000);
my_error(nfd, "epoll_wait error");
for(i = 0; i < nfd; ++i)