重写muduo库之组件梳理

目录

1、概述

2、Channel+Poller

3、EventLoop

4、EventLoopThread

5、Acceptor

6、TcpConnection

7、TcpServer


1、概述

mainReactor就是我们代码中的mainloop(baseloop),subReactor是我们代码中的工作线程进行读写事件的处理,读数据(read)是底层做的,decode是我们自己做的。compute和encode也是我们自己做的。从网络上read数据,然后从网络上send数据,这些是由muduo库帮我们做的。decode compute encode是我们用户在OnMessage处理的业务逻辑。每一个loop对应一个线程,每一个线程都是一个独立的Reactor。

2、Channel+Poller

看一下channel的成员变量:

channel主要做的事情是:
封装了fd,events和revents,还有一组回调方法。

  • fd就是表示要往poller上注册的文件描述符
  • events就是事先设置的fd所感兴趣的事件(读事件或者写事件)
  • revents就是poller最终给我们channel通知的这个fd上发生的事件,channel根据相应的发生的事件来执行相应的回调。

对于上层来说,如果有一个fd的话,它就会把fd打包成channel通道,然后下发到poller上。

看一下poller的成员变量:

poller有一个成员变量channels,是一个map表,键就是channel打包的sockfd,值就是包含fd对应的channel,也就是说如果poller检测到哪个fd有事件发生了,就可以通过发生事件的fd和这个map表,找到这个fd对应的channel,这个channel里面就记录着详细的对应事件的回调方法。

但是channel和poller是独立的,它们是不能直接互相通信的,它们都是依赖Eventloop来通信的。
不管是channel还是poller,都有一个成员变量记录它所在的事件循环(loop成员变量)。

Muduo是一个C++网络编程,它专注于提供高性能、轻量级的TCP/UDP服务器端和客户端编程支持,主要用于实时通信和游戏开发等场景。Muduo本身并不直接包含图形用户界面(GUI)组件,它的核心功能在于底层网络编程。 如果你需要在Muduo的基础上构建一个图形化的应用,通常会采用其他如Qt、wxWidgets或GTK+等,它们提供了丰富的控件和工具来设计用户界面。你可以在Muduo服务器处理网络请求的同时,利用这些的API来创建和管理窗口、按钮、文本框等元素,并将数据交互融入到图形界面上。 例如,在C++中,你可以这样做: ```cpp #include "muduo/net/Server.h" #include <QApplication> #include <QPushButton> class MuduoGui : public QMainWindow { Q_OBJECT public: explicit MuduoGui(QWidget *parent = nullptr) : QMainWindow(parent), server_(new muduo::net::Server()) {} private slots: void startServer() { server_->start(); } private: muduo::net::Server* server_; QPushButton* startButton; }; int main(int argc, char **argv) { QApplication app(argc, argv); MuduoGui window; window.setWindowTitle("Muduo GUI"); window.show(); // 连接按钮点击事件 startButton = new QPushButton(window); startButton->setText("Start Server"); connect(startButton, &QPushButton::clicked, &window, &MuduoGui::startServer); return app.exec(); } ``` 在这个例子中,Muduo服务器作为后台任务运行,而图形界面通过Qt的按钮控制其启动。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值