程序员人生 网站导航

muduo源码分析--我对muduo的理解

栏目:互联网时间:2014-11-07 08:35:21

分为几个模块 EventLoop、TcpServer、Acceptor、TcpConnection、Channel等

对EventLoop来讲:

他只关注里面的主驱动力,EventLoop中只关注poll,这类系统调用使得其成为Reactor模式,EventLoop中有属于这个loop的所有Channel,这个loop属于哪个Server.

 

几个类存在的意义:

从利用层使用的角度来看,用户需要初始化1个EventLoop,然后初始化1个TcpServer(固然也能够自定义个TcpServer,自定义数据处理函数需要注册到TcpServer内),然后调用TcpServer的start函数,然后调用EventLoop的loop()函数。全部用户层的使用流程就是这样的!

从用户层的利用方法来解析Muduo库的设计思想:

首先来看TcpServer这个类,从名字来看,它是1个http://www.wfuyu.com/server/,里面肯定需要有1个用于监听某个地址的套接字,这个是Acceptor类,这是由TcpServer引出的第1个类,在Acceptor类中封装了监听套接字,Acceptor负责了1个socketfd,这个socketfd就是1个监听套接字。当这个套接字上有可读事件时,调用了Acceptor的handleRead函数,此函数的内部就是accept()系统调用了,函数返回产生了1个连接套接字,紧接着就是调用Acceptor中的回调函数newConnectionCallback_,那末这个回调是谁注册的呢?肯定是谁具有Acceptor谁就负责初始化Acceptor中的newConnectionCallback_回调喽!那末就是TcpServer负责注册!在进行TcpServer初始化时调用Acceptor中的setNewConnectionCallback()函数将newConnection赋值给newConnectionCallback_。也就是说,在Acceptor中1旦accept()系统调用成功返回就立马调用newConnection函数。

到目前为止,遗留下了以下几个问题:

1、  Acceptor中的handleRead()函数是甚么时候被调用的!

2、  newConnecion虽然说属于TcpServer,但是newConnection函数的作用是创建了1个类!这个类的作用也是举足轻重!

 

接下来介绍下由TcpServer引出的Acceptor类:

首先这个类是属于内部类。既然这个类是管理监听套接字的,那末这个监听套接字的生命周期就是由Acceptor类来管理。这个套接字在Acceptor就是Socket,同时也有1个EventLoop指针,表明这个Acceptor属于某1个EventLoop(由于Acceptor依赖于某1个TcpSever,同时TcpServe和EventLoop是有依赖关系的)。同时还有1个newConnectionCallback_函数,这个函数是在TcpServer初始化的时候被赋值的。Listening_表示当前这个监听套接字的状态,idleFd_是1个输出毛病的描写符。这里还有1个新的类―Channel!这个类在全部库中起着桥接的作用,全部这个类将有些东西单独提取,是的其他各个类的功能更加单1,关于这个类的介绍不在这里,毕竟Acceptor类是1个内部类,如果这个1个庞大的类由内部类引出,显得不够重视!呵呵!这里暂时雪藏Channel类!

关于Acceptor类的接口,只有很少的3个:

其中1个是setNewConnectionCallback,由于Acceptor类属于TcpServer类,所以调用合格函数的肯定是属于Acceptor的所有者,也就是TcpServer类,这个函数在TcpServer的构造函数中被调用,将newConnectionCallback_函数赋值为newConnection,已说过了,有点

------分隔线----------------------------
------分隔线----------------------------

最新技术推荐