介绍
muduo很多人都听说过,那evpp可以理解成是muduo用C++11改写后的升级版。
相比muduo的代码风格,evpp会显得更加现代一点,更讨我们年轻人的喜欢。
作为例子,这里是一段TCP Echo Server的示例代码:
evpp::EventLoop loop;
evpp::TCPServer server(&loop, "0.0.0.0:9099", "TCPEchoServer", thread_num);
server.SetMessageCallback([](const evpp::TCPConnPtr& conn,
evpp::Buffer* msg) {
conn->Send(msg);
});
server.SetConnectionCallback([](const evpp::TCPConnPtr& conn) {
if (conn->IsConnected()) {
LOG_INFO << "A new connection from " << conn->remote_addr();
} else {
LOG_INFO << "Lost the connection from " << conn->remote_addr();
}
});
server.Init();
server.Start();
loop.Run();
evpp的核心代码其实不多,之前也已经花了一段时间去阅读;
总的来说,代码本身还是十分通俗易懂的,不像某些天书C++;
相比muduo,evpp一个很明显的变化就是,IO复用相关的抽象直接使用了libevent;
但是,看完之后,总是缺少一个系统性的认识,因此,想借此机会进行梳理;
此外,网上虽然有很多muduo的解析,但是介绍evpp的还是挺少的;
对于习惯C++11风格的人,应该算是多了一种选择;
https://github.com/Qihoo360/evpp
核心类
这里,我先罗列下evpp中的核心类
- TCPServer
- Listener
- TCPClient
- Connector
- TCPConn
- FdChannel
- EventLoop
- EventLoopThread
- EventLoopThreadPool
只要是熟悉Socket编程的同学,看见这几个类后应该还是有点亲切感的。
其中,TcpClient/TcpServer分别抽象TCP客户端和服务器;Connector/Listener分别包装TCP客户端和服务器的建立连接/接受连接;TcpConnection抽象一个TCP连接,无论是客户端还是服务器只要建立了网络连接就会使用TcpConnection;FdChannel是设备fd的包装,在muduo中主要包装socket以及该socket对应的事件处理回调函数;EventLoop是一个事件发生器,它驱动底层的IO复用器产生/发现事件,然后将事件派发到Channel处理;EventLoopThread是一个带有EventLoop的线程;EventLoopThreadPool自然是一EventLoopThread的资源池,维护一堆EventLoopThread。
TCPServer类
这里,我们以自顶向下的方式进行梳理。所以,我们先来看看TCPServer的数据成员。
// TCPServer的名字,比如"Echo", "Discard"等
const std::string name_;
// TCPServer最重要的一点就是,创建ListenFD然后Accept新连接;
// 接下来的3项,给出了必要的信息;