muduo网络库学习(二)对套接字和监听事件的封装Channel

muduo对描述符fd,需要监听的事件events,当fd被激活调用的可读/可写/关闭/错误回调函数进行了封装,实现在Channel类中,Poller监听的其实就是一个个Channel对象,Channel可以向Poller注册自己关心的事件,当被激活后调用相应的回调函数。类似libevent的struct event。
Channel在整个事件驱动循环中的流程大致如下

  1. Acceptor接收到客户端请求,调用TcpServer回调函数
  2. TcpServer回调函数中创建TcpConnection对象,代表着一个Tcp连接
  3. TcpConnection构造函数中创建Channel对象,保存客户端套接字fd和关心的事件(可读)
  4. Channel注册自己到所属事件驱动循环(EventLoop)中的Poller上
  5. Poller开始监听,当发现Channel被激活后将其添加到EventLoop的激活队列中
  6. EventLoop在poll返回后处理激活队列中的Channel,调用其处理函数
  7. Channel在处理函数中根据被激活的原因调用不同的回调函数(可读/可写等)

其中

  1. Acceptor,监听类,用于监听客户端请求,然后接收客户端
  2. TcpServer,服务器类,用于管理所有的TcpConnection
  3. TcpConnection,Tcp连接类,代表一个Tcp连接,内部保存对应的Channel
  4. Channel,套接字和相应事件及回调函数的封装,一个事件类
  5. Poller,io复用的封装,用于监听Channel
  6. EventLoop,事件驱动主循环,调用poll函数,管理激活队列,类似libevent的struct event_base

这里写图片描述


函数对象std::function
C++基于对象其实就是利用std::function/std::bind实现的,作用是绑定某个类的函数指针
使用方法如

#include <functional>
typedef std::function<void()> Callback;

void function_bind_test(Callback func)
{
    func();/* 这里调用相当于conn->connectionEstablished() */
}

function_bind_test(std::bind(&TcpConnection::connectionEstablished, conn));

std::function/std::bind为类的成员函数的调用提供更多灵活性,在C++11引入lambda后逐渐取代了std::bind,C++14后lambda支持模板参数后完全取代了std::bind


Channel定义如下,成员函数主要就是

  1. 设置回调函数set*Callback
  2. 设置对fd关心的事件,将自己存储的fd及相应的事件注册到Poller中enable*
  3. 删除对fd的监听,将其从PollerChannelMap中移除disableAll
  4. 被激活时调用的回调函数hanleEvent
/* 
 * Channel其实就是一个事件类,保存fd和需要监听的事件,以及各种回调函数
 * 类似libevent的struct event
 */
class Channel : noncopyable
{
 pu
  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值