您的位置:首页 > 其它

从epoll构建muduo-7 加入IMuduoUser

2013-04-25 16:50 351 查看
mini-muduo版本传送门

version 0.00 从epoll构建muduo-1 mini-muduo介绍

version 0.01 从epoll构建muduo-2 最简单的epoll

version 0.02 从epoll构建muduo-3 加入第一个类,顺便介绍reactor

version 0.03 从epoll构建muduo-4 加入Channel

version 0.04 从epoll构建muduo-5 加入Acceptor和TcpConnection

version 0.05 从epoll构建muduo-6 加入EventLoop和Epoll

version 0.06 从epoll构建muduo-7 加入IMuduoUser

version 0.07 从epoll构建muduo-8 加入发送缓冲区和接收缓冲区

version 0.08 从epoll构建muduo-9 加入onWriteComplate回调和Buffer

version 0.09 从epoll构建muduo-10 Timer定时器

version 0.11 从epoll构建muduo-11 单线程Reactor网络模型成型

version 0.12 从epoll构建muduo-12 多线程代码入场

version 0.13 从epoll构建muduo-13 Reactor + ThreadPool 成型

mini-muduo v0.06版本,这个版本应该算是一个里程碑版本,最重要的修改是将库和库的用户分离。完整可运行的示例可从github下载,使用命令git checkout v0.06可切换到此版本,在线浏览此版本到这里

1 在这个版本中,我们的网络库才真正的能被称为“库”。整个mini-muduo程序现在被分成了两部分,一边是库,另一边是库的用户。EchoServer这个类就是用户了,用户关心的是接到客户端的数据后如何处理,然后返回什么内容给客户端。而库要做的是顺利接收客户端数据,并将收到的数据送给用户处理,同时在用户发出发送指令后能将数据完整的发送给客户端。作为mini-muduo的用户,必须实现IMuduoUser接口,这个接口是网络库和用户之间的桥梁。这个接口和原始muduo几乎是一样的,唯一的一点差别是实现方式,在原始的muduo中,作者用boost::function和boost:bind取代虚函数,感兴趣的读者可以参考这篇文章(以boost::function和boost:bind取代虚函数)。

2 IMuduoUser里目前有两个纯虚函数,onConnection和onMessage,分别在连接建立和收到数据的时候被调用,目前IMuduoUser接口还有两个地方待完善,第一,还有一个重要的接口没有加进来,那就是onWriteComplate,因为这个回调的实现稍微有点复杂,这个回调会在v0.08版本加入进来,到时再详细介绍。第二,onMessage回调的参数还很原始,onMessage担负着输送数据给用户的重任,当前版本只用了一个const string&来表示数据而不像muduo一样有专门的Buffer类,这个缺陷也会在v0.08版本得到完善。观察IMuduoUser的两个方法,发现都将TcpConnection传递给了用户,是的,这个类以后就是用户的指挥棒了,用户想发送数据或者做点别的操作,都是通过TcpConnection来完成的。目前最重要的就是send方法。

3 因为响应请求的过程从TcpConnection移动到了EchoServer中,所以TcpConnection也做了相应更改,在原来的onIn方法里不再直接调用write将数据传回,而是在其中调用了其保存的IMuduoUser::onMessage方法将数据传递给了Muduo网络库的真正用户。同时TcpConnection增加了一个send方法,这个方法包装了write操作,提供给网络库的用户来使用。onMessage()方法的参数里会传递TcpConnection给用户,用户可以自行决定是否发送数据。

4 我找了muduo原始代码里的一个例子,这是一个echo服务器位于muduo/example/sample/echo 这是很简单的例子了,可以看到muduo的用户是这样使用muduo库的

int main()
{
LOG_INFO << "pid = " << getpid();
muduo::net::EventLoop loop;
muduo::net::InetAddress listenAddr(2007);
EchoServer server(&loop, listenAddr);
server.start();
loop.loop();
}


再看看我们的main.cc,已经与原始muduo非常接近了。

int main(int args, char** argv)
{
EventLoop loop;
EchoServer echoserver(&loop);
echoserver.start();
loop.loop();
return 0;
}
EchoServer类我就不粘贴对比代码了,也与muduo非常相似。

5 本版本还修正了一些命名规范问题,把接口头文件里的虚函数换成纯虚纯函数,这都是之前代码的一些疏忽。

6 本版本依然是问题多多,比如读取和发送操作实现的都非常简单,几乎还处于不可用状态。内存泄漏一大堆,单线程有可能阻塞等等问题,后续版本逐步解决这些问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: