muduo网络库(2):对套接字和监听事件的封装Channel
一、概述
Channel类中数据成员:
- 描述符fd;
- 需要监听的事件events;
- fd被**调用的可读/可写/关闭/错误回调函数;
`
const int fd_; //描述符fd;
int events_; //需要监听的事件events;
EventCallback readCallback_; //fd被**调用的可读回调函数;
EventCallback writeCallback_; //fd被**调用的可写回调函数;
EventCallback closeCallback_; //fd被**调用的关闭回调函数;
EventCallback errorCallback_; //fd被**调用的错误回调函数;
Poller类监听的其实就是一个个Channel对象,Channel可以向Poller注册自己关心的事件,当被**后调用相应的回调函数。类似libevent的struct event。
二、Channel在整个事件驱动循环中的大致流程
- Acceptor接收到客户端请求,调用TcpServer回调函数;
- TcpServer回调函数中创建TcpConnection对象,代表着一个Tcp连接;
- TcpConnection构造函数中创建Channel对象,保存客户端套接字fd和关心的事件(可读);
- Channel注册自己到所属事件驱动循环(EventLoop) 中的 Poller上;
- Poller开始监听,当发现Channel被**后将其添加到EventLoop的**队列中;
- EventLoop在poll返回后处理**队列中的Channel,调用其处理函数;
- Channel在处理函数中根据被**的原因调用不同的回调函数(可读/可写等)。
其中,各个类分别是:
- Acceptor监听类,用于监听客户端请求,然后接收客户端;
- TcpServer服务器类,用于管理所有的TcpConnection;
- TcpConnectionTcp连接类,代表一个Tcp连接,内部保存对应的Channel;
- Channel,套接字和相应事件及回调函数的封装,一个事件类;
- Poller,io复用的封装,用于监听Channel
-
EventLoop,事件驱动主循环,调用poll函数,管理**队列,类似libevent的struct event_base
未完待续