[muduo网络库]——使用muduo库搭建Echo服务器(剖析muduo网络库核心部分、设计思想)

news/2024/9/23 7:54:25/

在此之前,我们对于muduo库的每一类几乎都进行了逐行的分析,但是一个网络库的每个模块之间总是有千丝万缕的关系,所以可能有的地方还是有分析的不到位,所以从这一篇开始,我们从muduo的简单使用----搭建一个Echo服务器,来一步一步的分析一下整个muduo库的内在联系。

TCP网络编程最本质是的处理三个半事件

连接建立:服务器accept(被动)接受连接,客户端connect(主动)发起连接
连接断开:主动断开(close、shutdown),被动断开(read返回0)
消息到达:客户端文件描述符可读
消息发送完毕:这算半个。对于低流量的服务,可不必关心这个事件;这里的发送完毕是指数据写入操作系统缓冲区,将由TCP协议栈负责数据的发送与重传,不代表对方已经接收到数据。
接下来,我们从这几个事件来梳理整个muduo库。

搭建Echo服务器

在学习一个网络库之前,我们一定是要先学会怎么使用这个网络库,接下来,我们搭建一个最简单的Echo服务器

什么是Echo服务器

echo服务器,也称为回显服务器,简单来说就是服务端收到什么,就给客户端发送什么。

源码

#include <my_muduo/TcpServer.h>
#include <my_muduo/logger.h>#include <string>
#include <functional>class EchoServer
{
public:EchoServer(EventLoop *loop,const InetAddress &addr,const std::string &name):server_(loop,addr,name),loop_(loop){//注册回调函数server_.setConnectionCallback(std::bind(&EchoServer::onConnection,this,std::placeholders::_1));server_.setMessageCallback(std::bind(&EchoServer::onMessage,this,std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));//设置合适的loop线程数量 loopThreadserver_.setThreadNum(3);}void start(){server_.start();}
private://连接建立或者断开的回调void onConnection(const TcpConnectionPtr &conn){if(conn->connected()){LOG_INFO("Connection UP : %s",conn->peerAddress().toIpPort().c_str());}else{LOG_INFO("Connection DOWN : %s",conn->peerAddress().toIpPort().c_str());}}//可读写事件回调void onMessage(const TcpConnectionPtr &conn,Buffer *buf,TimeStamp time){std::string msg = buf->retrieveAllAsString();conn->send(msg);conn->shutdown(); //关闭写端EPOLLHUP=> closeCallback}EventLoop *loop_;TcpServer server_;
};int main()
{EventLoop loop;InetAddress addr(8000);//Acceptor non-blocking listenfd create bindEchoServer server(&loop,addr,"EchoServer-01");//listen loopthread listenfd => acceptChannel => mainLoop => subloopserver.start();loop.loop(); //启动mainloop的底层poolerreturn 0;
}

从代码中,我们可以看出来它一共做了如下几件事:

  • 创建了一个EventLoop: EventLoop loop;,这个EventLoop就是mainLoop,loop就是baseloop_
  • 指定了接收端口号,ip使用默认的127.0.0.1;
  • 创建了一个server对象,即TcpServer类对象 : TcpServer server_;,并传入了loop,addr,以及指定了对象名;
  • 启动TcpServer服务器server.start();,调用TcpServer::start()
  • 开启事件循环: loop.loop();,调用EventLoop::loop()

代码地址:https://github.com/Cheeron955/mymuduo/tree/master

好了~ 使用muduo库搭建Echo服务器就到这里结束了,下一篇我们开始按照启动服务器,连接建立、消息收发、连接关闭的顺序来逐一剖析muduo网络库工作流程。下一节见~

http://www.ppmy.cn/news/1462029.html

相关文章

Hadoop3:客户端向HDFS写数据流的流程讲解(较枯燥)

一、场景描述 我们登陆HDFS的web端&#xff0c;上传一个大文件。 二、流程图 三、讲解 流程1&#xff08;Client与NameNode交互&#xff09; 1、HDFS client创建DistributedFileSystem&#xff0c;通过dfs与NameNode进行2次&#xff08;一来一回4次&#xff09;对话&#x…

Leetcode—2244. 完成所有任务需要的最少轮数【中等】

2024每日刷题&#xff08;136&#xff09; Leetcode—2244. 完成所有任务需要的最少轮数 实现代码 class Solution { public:int minimumRounds(vector<int>& tasks) {unordered_map<int, int> map;for(int task: tasks) {map[task];}int ans 0;// freq 1 …

阅读笔记——《代码整洁之道》ch2

引言 clean-code ch2阅读笔记 有意义的命名 名副其实 选择体现本意的名称能让人更容易理解和修改代码。 避免误导 怎么能知道该调用哪个函数呢? getActiveAccount(); getActiveAccounts(); getActiveAccountInfo();moneyAmount与money没区别,customerInfo与customer没区别。…

编译gdb:在x86虚拟机上,加载分析arm程序及崩溃

目标 在X86虚拟机上&#xff0c;加载arm程序及崩溃。 最早我想的是编译一个arm版本的&#xff0c;在虚拟机上显然不能使用。 后来同事跟我说&#xff0c;可以编译一个在虚拟机上&#xff0c;分析arm的gdb&#xff0c;我觉得好神奇。事实证明确实可以。 首先不能使用已编译的…

Android Studio kotlin 转 Java

一. 随笔记录 java代码可以转化成kotlin代码&#xff0c;当然 Kotlin 反过来也可以转java 在Android Studio中 可以很方便的操作 AS 环境&#xff1a;Android Studio Iguana | 2023.2.1 二. 操作步骤 1.步骤 顶部Tools ----->Kotlin ------>Show Kotlin Bytecode 步…

图像中的attention及QKV机制解释

简单记录/推荐两篇博客&#xff0c;后续细化写一下&#xff1a; 图像中的各类 attention https://blog.csdn.net/weixin_44505185/article/details/127013204 Cross-attention的直观理解 首先理解&#xff0c;cross-attention 是两个不同向量间的相关计算&#xff0c;一般Q…

联丰策略股票官网分析A股三大指数集体收跌,超3800只股票下跌

查查配今日A股三大指数集体收跌。沪指低开低走,午后A股上了微博热搜。 联丰策略拥有一支由知名互联网公司和国内证券金融机构的行业专家组成的一流运营团队。凭借他们在互联网产品开发和金融风险管理方面的丰富经验,我们的团队致力于为客户提供专业和个性化的证券交易服务。 截…

齐护K210系列教程(二十七)_语音识别

语音识别 1.烧录固件和模型2.语音识别程序2.1训练并识别2.2使用本地文件语音识别 3.课程资源联系我们 1.烧录固件和模型 注&#xff1a;本应用只适用于有麦克风功能的型号&#xff1a;AIstart_pro、AIstart_掌机、AIstart_Mini, 其它型号不支持&#xff01; 机器码生成以及模…