muduo和shadowsocks网络架构对比

muduo是陈硕开源出来的网络库,提供方便的TCPServer等类,几行代码便可以实现高效的服务器。shadowsocks是python编写的大名鼎鼎的翻墙工具,网络处理部分的代码也是十分优秀。两者无疑都以epoll为根基,笔者在阅读这两部分代码时,觉得都很好,所以写下这篇博客记录。

muduo的做法

要看懂muduo,先搞懂几个概念。channelpollerconnection

先解读Acceptor类,顾名思义,该类创建server_socket,依据这个fd来创建channel,然后把channel加入到epoll中。这个channel的可读回调函数作用是accept连接,之后得到一个connfd,然后调用newConnectionCallback_(connfd, peerAddr)

那么这个newConnectionCallback_在哪里定义的呢?也是顾名思义的一个类TcpServer,这个类在初始化的时候创建acceptor对象,然后设置newConnectionCallback_

这时候我们再看newConnectionCallback_的作用。我们accept的时候会得到一个fd,之后根据这个fd创建TcpConnection对象,创建这个对象的构造函数中,创建一个

epoll有事件发生的时候,会得到有事件的fd,poller中存储了fd=>channel的对应关系。

所以有事件发生就会得到一个channel数组,即active_channels,之后便currentActiveChannel_->handleEvent(pollReturnTime_);

shadowsocks的做法

shadowsocks的核心是TCPRelayHandler这个类,每次一个新连接就会新建一个实例,并且把fd的handler设置成为该实例,这个fd=>handler的映射关系是存储在TCPRelay实例中的。

epoll有事件发生的时候,触发TCPRelayhandle_event函数处理,根据fd=>handler对应关系得到handler来处理。

共性

所以我认为muduo的Channel就是ss中的TCPRelayHandler的作用。