muduo是陈硕开源出来的网络库,提供方便的TCPServer等类,几行代码便可以实现高效的服务器。shadowsocks是python编写的大名鼎鼎的翻墙工具,网络处理部分的代码也是十分优秀。两者无疑都以epoll为根基,笔者在阅读这两部分代码时,觉得都很好,所以写下这篇博客记录。
muduo的做法
要看懂muduo,先搞懂几个概念。channel
,poller
,connection
。
先解读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有事件发生的时候,触发TCPRelay
的handle_event
函数处理,根据fd=>handler对应关系得到handler来处理。
共性
所以我认为muduo的Channel就是ss中的TCPRelayHandler的作用。