基于muduo网络库开发服务器程序和CMake构建项目 笔记

2024-02-02 09:44

本文主要是介绍基于muduo网络库开发服务器程序和CMake构建项目 笔记,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

跟着施磊老师做C++项目,施磊老师_腾讯课堂 (qq.com)

一、基于muduo网络库开发服务器程序

  1. 组合TcpServer对象
  2. 创建EventLoop事件循环对象的指针
  3. 明确TcpServer构造函数需要什么参数,输出ChatServer的构造函数
  4. 在当前服务器类的构造函数当中,注册处理连接的回调函数和处理读写事件的回调函数
  5. 设置合适的服务端线程数量,muduo库会自己分配I/O线程和worker线程
  • test.cpp 
/*muduo网络库给用户提供了两个主要的类TcpServer: 用于编写服务器程序的TcpClient: 用于编写客户端程序的epoll + 线程池好处:能够把网络I/O的代码和业务代码区分开对于业务代码主要暴露两个:用户的连接和断开;用户的可读写事件告诉muduo库,你对哪些事件感兴趣,并且你给我提前注册一个回调函数,当这些事情发生时,我会通知你,你去做你的事情吧!
*/
#include <muduo/net/TcpServer.h>
#include <muduo/net/EventLoop.h>
#include <iostream>
#include <functional>
#include <string>using namespace std;
using namespace muduo;
using namespace muduo::net;
using namespace placeholders;
// 基于muduo网络库开发服务器程序
/*1.组合TcpServer对象2.创建EventLoop事件循环对象的指针3.明确TcpServer构造函数需要什么参数,输出ChatServer的构造函数4.在当前服务器类的构造函数当中,注册处理连接的回调函数和处理读写事件的回调函数5.设置合适的服务端线程数量,muduo库会自己分配I/O线程和worker线程
*/
class ChatServer {
public:// 初始化TcpServer   loop:事件循环   listenAddr:IP+Port   nameArg:服务器的名字ChatServer(EventLoop *loop, const InetAddress &listenAddr, const string &nameArg): m_server(loop, listenAddr, nameArg), m_loop(loop) {// 给服务器注册用户连接的创建和断开回调m_server.setConnectionCallback(std::bind(&ChatServer::onConnection, this, _1));// 给服务器注册用户读写事件回调m_server.setMessageCallback(std::bind(&ChatServer::onMessage, this, _1, _2, _3));// 设置服务器端的线程数量 1个I/O线程 3个worker线程m_server.setThreadNum(4);}// 开启事件循环void start() {m_server.start();}
private:// 专门处理用户的连接创建和断开  epoll listenfd acceptvoid onConnection(const TcpConnectionPtr &conn) {cout<<conn->peerAddress().toIpPort() <<" -> "<<conn->localAddress().toIpPort() <<" is ";if(conn->connected()) {cout<<"state:online"<<endl;}else {cout<<"state:offline"<<endl;conn->shutdown(); // close(fd)// m_loop->quit();}}// 专门处理用户的读写事件  conn连接/buf缓冲区/time接收到数据的时间信息void onMessage(const TcpConnectionPtr &conn, Buffer *buffer, Timestamp time) {string buf = buffer->retrieveAllAsString();cout<<"recv data:"<<buf<<" time:"<<time.toString()<<endl;conn->send(buf);}TcpServer m_server; // #1EventLoop *m_loop;  // #2 epoll
};int main() {EventLoop loop; // epollInetAddress addr("127.0.0.1",6000);ChatServer server(&loop, addr, "ChatServer");server.start(); // listenfd epoll_ctl => epollloop.loop(); // epoll_wait以阻塞方式等待新用户连接,已连接用户的读写事件等return 0;
}
  • 生成server文件,注意muduo_net要在muduo_base前面,命令如下:
g++ test.cpp -o server -lmuduo_net -lmuduo_base -lpthread

二 注意:本文使用到了有关muduo的TcpServer.h中找到setConnectionCallback和setMessageCallback,点击跳转到有关connectionCallback的头文件中去

  /// Set connection callback./// Not thread safe.void setConnectionCallback(const ConnectionCallback& cb){ connectionCallback_ = cb; }/// Set message callback./// Not thread safe.void setMessageCallback(const MessageCallback& cb){ messageCallback_ = cb; }

有关muduo的Callbacks.h

typedef std::function<void (const TcpConnectionPtr&)> ConnectionCallback;// the data has been read to (buf, len)
typedef std::function<void (const TcpConnectionPtr&,Buffer*,Timestamp)> MessageCallback;

找到对应的Callback,我们就可以知道回调函数的参数和返回类型了

    // 专门处理用户的连接创建和断开  epoll listenfd acceptvoid onConnection(const TcpConnectionPtr &conn) {...}// 专门处理用户的读写事件  conn连接/buf缓冲区/time接收到数据的时间信息void onMessage(const TcpConnectionPtr &conn, Buffer *buffer, Timestamp time) {...}

我的往期文章: 

在windows和Linux中的安装 boost 以及 安装 muduo-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/weixin_41987016/article/details/135963909?spm=1001.2014.3001.5501

三、vscode实现一键运行server

tasks.json

{"version": "2.0.0","tasks": [{"type": "cppbuild","label": "C/C++: g++ 生成活动文件","command": "/usr/bin/g++","args": ["-fdiagnostics-color=always","-g","-o","${workspaceFolder}/bin/app",// "${fileDirName}/${fileBasenameNoExtension}",// "-lmuduo_net",// "-lmuduo_base",// "-lpthread"],"options": {"cwd": "${workspaceFolder}"},"problemMatcher": ["$gcc"],"group": {"kind": "build","isDefault": true},"detail": "编译器: /usr/bin/g++"}]
}
  • launch.json
{// 使用 IntelliSense 了解相关属性。 // 悬停以查看现有属性的描述。// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387"version": "0.2.0","configurations": [{"name": "(gdb) 启动","type": "cppdbg","request": "launch","program": "${workspaceFolder}/bin/app","args": [],"stopAtEntry": false,"cwd": "${fileDirname}","environment": [],"externalConsole": false,"MIMode": "gdb","setupCommands": [{"description": "为 gdb 启用整齐打印","text": "-enable-pretty-printing","ignoreFailures": true},{"description": "将反汇编风格设置为 Intel","text": "-gdb-set disassembly-flavor intel","ignoreFailures": true}]}]
}
  • CMakeLists.txt
cmake_minimum_required(VERSION 3.28.0)
project(test)
add_executable(server test.cpp)set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
target_link_libraries(server -lmuduo_net -lmuduo_base -lpthread) 
cmake -B build
cmake --build build

二、CMake构建项目

testmuduo存放CMakeLists.txt和test.cpp

  • CMakeLists.txt
cmake_minimum_required(VERSION 3.28.0)
project(test)# 配置头文件搜索路径
# include_directories()
# 配置库文件搜索路径
# link_directories()
# 设置需要编译的源文件列表
set(SRC_LIST test.cpp)
# 把.指定路径下的所有源文件名字放入变量名SRC_LIST里面
# aux_source_directory(. SRC_LIST)# 生成可执行文件server,由SRC_LIST变量所定义的源文件编译生成
add_executable(server ${SRC_LIST})message("打印一下bin目录:" ${BIN})
# 设置可执行文件的存放路径
set(EXECUTABLE_OUTPUT_PATH ${BIN})# 表示server这个目标程序,需要链接这三个muduo_net muduo_base pthread库文件
# target_link_libraries(server -lmuduo_net -lmuduo_base -lpthread) 
target_link_libraries(server muduo_net muduo_base pthread) 

与testmuduo文件夹同目录的CMakeLists.txt

  • CMakeLists.txt
cmake_minimum_required(VERSION 3.28.0)
project(test_project)set(BIN ${PROJECT_SOURCE_DIR}/bin)# # 配置编译选项
# set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -g)# 指定搜索的子目录
add_subdirectory(testmuduo)

在此终端执行命令:

cmake -B build 
cmake --build build

这篇关于基于muduo网络库开发服务器程序和CMake构建项目 笔记的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/670297

相关文章

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

Python基于wxPython和FFmpeg开发一个视频标签工具

《Python基于wxPython和FFmpeg开发一个视频标签工具》在当今数字媒体时代,视频内容的管理和标记变得越来越重要,无论是研究人员需要对实验视频进行时间点标记,还是个人用户希望对家庭视频进行... 目录引言1. 应用概述2. 技术栈分析2.1 核心库和模块2.2 wxpython作为GUI选择的优

一文教你如何将maven项目转成web项目

《一文教你如何将maven项目转成web项目》在软件开发过程中,有时我们需要将一个普通的Maven项目转换为Web项目,以便能够部署到Web容器中运行,本文将详细介绍如何通过简单的步骤完成这一转换过程... 目录准备工作步骤一:修改​​pom.XML​​1.1 添加​​packaging​​标签1.2 添加

一文详解如何从零构建Spring Boot Starter并实现整合

《一文详解如何从零构建SpringBootStarter并实现整合》SpringBoot是一个开源的Java基础框架,用于创建独立、生产级的基于Spring框架的应用程序,:本文主要介绍如何从... 目录一、Spring Boot Starter的核心价值二、Starter项目创建全流程2.1 项目初始化(

tomcat多实例部署的项目实践

《tomcat多实例部署的项目实践》Tomcat多实例是指在一台设备上运行多个Tomcat服务,这些Tomcat相互独立,本文主要介绍了tomcat多实例部署的项目实践,具有一定的参考价值,感兴趣的可... 目录1.创建项目目录,测试文China编程件2js.创建实例的安装目录3.准备实例的配置文件4.编辑实例的

使用Java实现通用树形结构构建工具类

《使用Java实现通用树形结构构建工具类》这篇文章主要为大家详细介绍了如何使用Java实现通用树形结构构建工具类,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录完整代码一、设计思想与核心功能二、核心实现原理1. 数据结构准备阶段2. 循环依赖检测算法3. 树形结构构建4. 搜索子

SpringBoot使用OkHttp完成高效网络请求详解

《SpringBoot使用OkHttp完成高效网络请求详解》OkHttp是一个高效的HTTP客户端,支持同步和异步请求,且具备自动处理cookie、缓存和连接池等高级功能,下面我们来看看SpringB... 目录一、OkHttp 简介二、在 Spring Boot 中集成 OkHttp三、封装 OkHttp

利用Python开发Markdown表格结构转换为Excel工具

《利用Python开发Markdown表格结构转换为Excel工具》在数据管理和文档编写过程中,我们经常使用Markdown来记录表格数据,但它没有Excel使用方便,所以本文将使用Python编写一... 目录1.完整代码2. 项目概述3. 代码解析3.1 依赖库3.2 GUI 设计3.3 解析 Mark

springboot集成Deepseek4j的项目实践

《springboot集成Deepseek4j的项目实践》本文主要介绍了springboot集成Deepseek4j的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录Deepseek4j快速开始Maven 依js赖基础配置基础使用示例1. 流式返回示例2. 进阶

利用Go语言开发文件操作工具轻松处理所有文件

《利用Go语言开发文件操作工具轻松处理所有文件》在后端开发中,文件操作是一个非常常见但又容易出错的场景,本文小编要向大家介绍一个强大的Go语言文件操作工具库,它能帮你轻松处理各种文件操作场景... 目录为什么需要这个工具?核心功能详解1. 文件/目录存javascript在性检查2. 批量创建目录3. 文件