【C++】 网络编程实战:带你用 muduo 搭建一个高性能 TCP 服务

muduo---C++网络编程库 陈硕 muduo 参考资料 muduo源码剖析 muduo基于Reactor模式实现 Reactor模式也是目前大多数Linux端高性能网络编程框架和网络应用所选择的主要架构,例如内存数据库Redis和Java的Netty库等。 muduo 架构 整个架构依照reactor模式,如如下图: 所谓的reactor模型,是有一个循环的过程,监听对应事件是否触发,触发时调用对应的callback函数进行处理; 这里的事件在muduo中包括socket可读写事件、定时器事件。在其他网络库中如libevent也包 阅读详情

moduo的诞生

1. 原始方案:Thread-Per-Connection(BIO)

每当一个客户端连接进来,就创建一个新线程去处理它的 socket。这种模型简单直观,但存在致命缺陷:线程资源有限,1 万个连接就要 1 万个线程,内存和上下文切换开销巨大;而且如果客户端连上来却不发数据,线程就会一直阻塞在 recv() 上,白白浪费资源。

2. 演进方案:IO 多路复用(epoll/select/poll)

为了解决线程爆炸问题,引入了多路转接模型。主线程不再为每个连接创建线程,而是用 epoll 同时监听所有套接字。当某个套接字有事件(新连接、可读、可写)时,才去处理它。这就是事件驱动 IO 的思想:谁有事,处理谁;没事的,不浪费资源。

3. Reactor 模型(单 Reactor 单线程)

把“用 epoll 监听事件 + 事件触发后调用回调处理”这套模式抽象出来,就是 Reactor 模型。Reactor 负责监听和分发事件,Handler 负责具体业务。但单 Reactor 单线程有一个瓶颈:所有事情都在一个线程里干,如果某个 Handler 的业务逻辑很耗时,整个 Reactor 都会被阻塞,其他客户端的事件全部延迟处理,无法利用多核 CPU。

4. 多线程多 Reactor 模型(Main-Sub Reactor)

为了解决单 Reactor 的性能上限,大佬们提出了多 Reactor 模型。核心思想是分工:

  • 主线程:只负责监听 listen_fd,接受新连接,然后把新连接的 connfd 分发给 Sub Reactor。

  • 子线程:有多个,每个跑在独立线程里,各自管理一部分连接的读写事件和业务逻辑。

这样,1 万个连接分散到 N 个 子线程 上,每个 Reactor 只管理几千个连接,压力骤减;多个 子线程 并行处理,真正利用多核 CPU。muduo 库采用的就是这种 One Loop Per Thread + 线程池 的 主线程 架构,是 C++ 高并发网络编程的经典范式。


moduo是什么

Muduo库是一个基于非阻塞IO和事件驱动的C++高并发TCP 网络编程库,它是一款基于主从Reactor模型的网络库,其使用的线程模型是one loop per thread,所谓的one loop per thread指的是:

一个线程只能有一个事件循环(EventLoop),用于响应计时器和IO事件。

一个文件描述符只能由一个线程进行读写,换句话说就是一个TCP连接必须归属于某个EventLoop管理

详解:

  • 非阻塞IO + 事件驱动:意思就是“你不找我,我不理你;你一来数据,我就立刻处理”。

  • 主从 Reactor 模型:就是“主线程接客,子线程干活”。

  • one loop per thread:一个线程配一个事件循环

  • 一个文件描述符只能由一个线程进行读写


Muduo库接口介绍

TcpServer类基础介绍

主要接口

TcpServer{
    void start();//启动服务器
    setConnectionCallback();//设置连接建立/关闭时的回调函数
    setMessageCallback();//设置消息处理回调函数
}

setConnectionCallback();

eg:

你开了一家餐厅,你雇佣了一个迎宾(muduo 库的 Acceptor)。

你给迎宾发了一本《迎宾与送客手册》,这就是 setConnectionCallback。手册里写了:

  • 如果客人来了(conn->connected() == true):

    • 你就说:“欢迎光临!”(打印日志)

    • 带客人去空桌子坐下(分配资源)

    • 把菜单递给他(准备接收数据)

  • 如果客人走了(conn->connected() == false):

    • 你就说:“欢迎下次再来!”(打印日志)

    • 把桌子收拾干净(释放资源)

    • 把客人从名单上划掉(_conn.reset())

代码长这样子

void onConnection(const TcpConnectionPtr &conn) {
    if (conn->connected()) {
        // 客人来了,执行“迎宾”操作
    } else {
        // 客人走了,执行“送客”操作
    }
}

触发时机: 客户端成功连接服务器时,或者客户端断开连接时,muduo 自动帮你调用一次。


setMessageCallback()

eg:

客人坐下后,他随时可能举手喊:“服务员,点菜!”(发来数据)。
你作为服务员,不能一直盯着他看(阻塞),所以你提前写好了一本《点菜与上菜手册》,这就是 setMessageCallback。手册里写了:

  • 当客人举手时(收到数据):

    • 你走过去,拿出纸笔,把他要点的菜记下来(buf->retrieveAllAsString() 读取数据)

    • 把菜名传给后厨(处理业务逻辑,比如查字典)

    • 后厨做好菜后,你端给客人(conn->send(res) 发送数据)

在代码里长这样:

void onMessage(const TcpConnectionPtr &conn, Buffer *buf, Timestamp time) {
    // 客人说话了(收到数据)
    std::string msg = buf->retrieveAllAsString(); // 记下客人说了啥
    // 处理业务逻辑...
    conn->send(res); // 给客人回应(上菜)
}

触发时机: 只要客户端发来数据,muduo 就会自动帮你调用一次。客户端发 100 次,它就调用 100 次。

但是TCP只是一个server,大佬在涉及的时候就把server和事件监控分开了


EventLoop类基础介绍

事件监控有几个这样重要的接口

EventLoop(){
    void loop();//开始事件循环
    void quit();//停止循环
    Timerld runAfter(delay,cb);//定时任务
}

有上面这这几个接口,我们就可以搭建我们的服务器了,但是还不够,在TcpServer中,有回调函数,它是一个什么的格式呢?

ConnectionCallback :
    connectCb(TcpConnectionPtr &conn) //这是连接建立/关闭建立

MessageCallback:
    onMessageCb(TcbConnectionPtr &conn, Buffer *buf){
    针对conn连接所接收放入到buf中的数据处理    
}

通过上面的两个类,我们确实可以完成服务器的搭建,但是我们现在是没办法去进行数据处理的,因为我们对回调函数还是不够熟悉,接下来我们再去熟悉了解一下

TcpConnection类基础介绍

TcpConnection{
    void send(std::string &msg);//发送数据
    bool connected();//判断当前连接是否连接正常
    void shutdown();//关闭连接
}

里面还有两个回调函数,但是不需要我们去做处理,当tcp连接的时候,内部就会帮我们去处理了

Buffer类基础介绍

Buffer{
    size_t readableBytes(); //获取缓冲区可读数据大小
    const char* peek();     //获取缓冲区中数据的起始地址
    int32_t peeklnt32() const; //尝试从缓冲区获取4字节数据,进行网络字节序转换为整型,但是数据并不从缓冲区删除
    void retrievelnt32();      //数据读取位置向后偏移4字节 本质上就是删除起始位置的4字节数据
    int32_t readlnt32();
    string retrieveAllAsString(); //从缓冲区取出所有数据,当作string返回,并删除缓冲区中的数据
    string retrieveAsString(size_t len); //从缓冲区取出len长度的数据,当作string返回,并删除缓冲区的数据
}

TcpClient类基础介绍

TcpClient{

        void connect(); //连接服务器

        void disconnect(); //关闭连接

        TcpConnectionPtr connection() const //获取客户端对应的TcpConenction连接

        

       // Muduo库的客户端也是通过Eventloop进行IO事件监控IO处理的

        void setConnectionCallback(ConnectionCallback cb); //设置连接建立/关闭时的回调函数

        void setMessageCallback(); //收到消息的回调处理函数

}

因为void connect(); 是非阻塞接口

所以会出现一种意外情况:

        connect连接还没有建立完全的情况下,调用connection接口获取连接,send发送数据

没有连接就可以跑了?明显不合理,所有客户端有一个接口去防止这个操作

//做计数同步操作的类
CountDownLatch{
    void wait();//计数大于0就等待(阻塞)
    countDown();//计数--,为0时唤醒wait
}

使用示例:字典翻译C/S

服务端

/*
    实现一个翻译服务器,客户端发送过来一个单词,返回一个汉语词语
*/

#include <muduo/net/TcpServer.h>
#include <muduo/net/EventLoop.h>
#include <muduo/net/TcpConnection.h>
#include <muduo/net/Buffer.h>
#include <iostream>
#include <string>
#include <unordered_map>

class DictServer{
    public:
        DictServer(int port): _server(&_baseloop, 
            muduo::net::InetAddress("0.0.0.0", port), 
            "DictServer", muduo::net::TcpServer::kReusePort)
            {
                // 设置连接事件 (连接建立/管理)的回调
                _server.setConnectionCallback(std::bind(&DictServer::onConnection, this, std::placeholders::_1));
                // 设置连接信息的回调
                _server.setMessageCallback(std::bind(&DictServer::onMessage, this, 
                    std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));
            }

        void start(){
            _server.start(); //先开始监听
            _baseloop.loop(); //开始死循环事件监控
        }
    public:
        void onConnection(const muduo::net::TcpConnectionPtr &conn){
            if(conn->connected()){
                std::cout << "连接建立!\n";
            }else{
                std::cout << "连接断开! \n";
            }
        }
        // 回调消息函数
        void onMessage(const muduo::net::TcpConnectionPtr &conn, muduo::net::Buffer *buf, muduo::Timestamp){
            static std::unordered_map<std::string, std::string> dict_map = {
                {"hello", "你好"},
                {"world", "世界"},
                {"apple", "苹果"}
            };
            std::string msg = buf->retrieveAllAsString();
            std::string res;
            auto it = dict_map.find(msg);
            if(it != dict_map.end()){
                res = it->second;
            }else{
                res = "未知单词!";
            }
            conn->send(res);
        };
    private:
        muduo::net::EventLoop _baseloop;
        muduo::net::TcpServer _server;
};

int main()
{
    DictServer server(9090);
    server.start();
    return 0;
}

客户端

#include <muduo/net/TcpClient.h>
#include <muduo/net/EventLoop.h>
#include <muduo/net/EventLoopThread.h>
#include <muduo/net/TcpConnection.h>
#include <muduo/net/Buffer.h>
#include <muduo/base/CountDownLatch.h>
#include <iostream>
#include <string>

class DictClient{
    public:
        DictClient(const std::string &sip, int sport):
            _baseloop(_loopthread.startLoop()),
            _downlatch(1), //初始化计数器为1,因为为0时才会唤醒
            _client(_baseloop, muduo::net::InetAddress(sip, sport), "DictClient")
            {
                // 设置连接事件 (连接建立/管理)的回调
                _client.setConnectionCallback(std::bind(&DictClient::onConnection, this, std::placeholders::_1));
                // 设置连接信息的回调
                _client.setMessageCallback(std::bind(&DictClient::onMessage, this, 
                    std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));

                // 连接服务器
                _client.connect(); 
                _downlatch.wait();

                // _baseloop.loop(); // 开始事件循环监控
            }

            bool send(const std::string &msg){
                if(_conn->connected() == false){
                    std::cout << "连接已经断开,发送数据失败!\n";
                    return false;
                }
                _conn->send(msg);
                
            }
    public:
        void onConnection(const muduo::net::TcpConnectionPtr &conn){
            if(conn->connected()){
                std::cout << "连接建立!\n";
                _downlatch.countDown(); // 计数--,为0时唤醒阻塞
                _conn = conn;
            }else{
                std::cout << "连接断开! \n";
                _conn.reset();
            }
        }
        // 回调消息函数
        void onMessage(const muduo::net::TcpConnectionPtr &conn, muduo::net::Buffer *buf, muduo::Timestamp){
            std::string res = buf->retrieveAllAsString();
            std::cout << res << std::endl;
        };
    private:
        muduo::net::TcpConnectionPtr _conn;
        muduo::CountDownLatch _downlatch;
        muduo::net::EventLoopThread _loopthread;
        muduo::net::EventLoop *_baseloop;
        muduo::net::TcpClient _client;
};

int main()
{
    DictClient client("127.0.0.1", 9090);
    while(1){
        std::string msg;
        std::cin >> msg;
        client.send(msg);
    }
    return 0;
}
Linux——Muduo库安装(包教包会) Muduo是一个基于Reactor模式的高性能C++网络库,适用于Linux平台。本文详细介绍了Muduo库的安装步骤:1)获取源码;2)安装依赖项boost和cmake;3)编译安装Muduo;4)将生成文件移动到系统目录。还提供了验证代码示例,演示如何构建一个回显服务器,并通过netcat命令测试其功能。安装过程需严格遵循步骤,建议使用root权限操作。Muduo库简化了Linux下C++高性能网络服务开发,是学习网络编程的优秀资源。安装成功后即可进行网络应用开发。 阅读详情

相关推荐

muduo网络库:高性能C++网络编程实战指南

网络编程是现代分布式系统的基础,而Reactor模式是实现高性能网络服务的核心架构。通过非阻塞IO与IO多路复用技术的结合,开发者可以构建支持高并发的网络应用。muduo作为专为Linux平台设计的高性能C++网络库,采用事件驱动架构和智能指针管理,显著提升了TCP网络编程效率。该库特别适合需要处理上万并发连接的场景,如实时通信系统、金融交易平台等。在实际工程中,muduo的简洁API和稳定性能表现突出,配合boost库的智能指针和函数对象,为开发者提供了强大的工具集。通过合理使用EventLoop事件循环

weixin_32705179的博客 184

TCP网络编程库——Muduo库

Muduo库的运用

m0_74246469的博客 2103

从零到一:手把手教你用C++ Muduo网络库搭建一个简易聊天服务器(附完整代码)

本文详细介绍了如何使用C++ Muduo网络库从零开始搭建一个简易聊天服务器,包含完整代码示例和深度解析。通过环境配置、核心架构解析、功能实现到高级扩展,帮助开发者掌握Muduo网络库的高效应用,提升实时通信开发能力。

weixin_32612263的博客 316

《Linux 多线程服务端编程:使用 muduo C++ 网络库》网上书店订购

《Linux 多线程服务端编程:使用 muduo C++ 网络库》网上书店订购内容简介本书主要讲述采用现代 C++ 在 x86-64 Linux 上编写多线程 TCP 网络服务程序的主流常规技术,重点讲解一种适应性较强的多线程服务器的编程模型,即 one loop per thread。这是在 Linux 下以 native 语言编写用户态高性能网络程序最成熟的模式,掌握之后可顺利地开发各类常见的

陈硕的Blog 6万+

【C++】开源:Muduo网络库配置与使用

muduo使用

DevFrank的博客 3041

基于C++的高性能网络库muduo实战项目

简介:muduo是一个专为高性能、线程安全服务器开发设计的C++网络编程库,采用事件驱动与异步非阻塞I/O模型,支持epoll等高效机制。本文档围绕muduo的简化版本“SimpleMuduo-master”展开,重点介绍其核心模块如TcpServer、EventLoop、Channel及高效的异步日志系统AsyncLogging。通过缓冲区暂存和独立线程处理日志写入,显著降低I/O对主线程的影响,提升服务性能。项目包含完整源码、构建脚本与示例,适用于学习和快速搭建TCP服务器应用。

weixin_35886636的博客 452

基于C++重构muduo网络库搭建HTTP服务器项目设计及反思

为什么要做muduo库呢?在后端开发中,服务器往往是基于如httplib库、muduo库等基础组件的基础上进行搭建的。选择重构muduo库,我们不仅可以借此机会了解网络库底层的实现逻辑以便于我们日后进行服务器的搭建,更重要的,我们可以学习muduo库中高效的事件驱动、多线程并发处理等优秀的设计理念。同时,可以加深我们对Epoll LT与ET模式、主从Reactor模式、非阻塞I/O读取、线程池,TCP、HTTP协议等等知识的巩固和掌握。在本项目中,我们将基于重构的muduo网络库搭建一个HTTP服务器件。

2301_76606232的博客 1767

从零做出可发布的2D冒险游戏!Unity全流程实战指南:从资源搭建到打包发布,新手也能跟着做

项目配置→资源导入→核心模块开发→关卡设计→调试→打包发布;玩家控制→敌人AI→道具系统→UI系统→游戏管理器→音效系统;新手开发重点:先实现核心玩法(移动、跳跃、攻击),再补充UI、音效、存档等辅助功能;调试是关键:每实现一个功能就测试,避免最后一堆bug难以定位。从零做一款完整的2D冒险游戏,能快速提升你的Unity综合能力——不仅能掌握C#编程、2D物理、UI系统,还能理解游戏开发的完整流程。先做出基础版,再慢慢迭代优化,你会发现游戏开发并没有想象中那么难。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1176

深入解析muduo:高性能C++多线程网络库架构设计

muduo是一个基于Reactor模式的高性能C++多线程网络库,专为Linux服务器环境设计。该项目由陈硕开发,采用现代C++11特性构建,旨在为开发人员提供一个简洁、高效且易于使用的网络编程框架。muduo采用单线程Reactor作为基础架构,每个EventLoop运行在独立的线程中,负责处理该线程内的所有I/O事件,同时提供了灵活的多线程支持方案,包括单线程模式、多Reactor模式和线程池...

gitblog_00010的博客 678

jmeter问题系列:Begin size 0 is not equal to fixed size 5

Begin size 0 is not equal to fixed size 5 ,问题的解决

雨水的早晨的博客 2412

手把手教你用EGM96模型校正DEM数据(含在线工具推荐)

本文详细介绍了如何使用EGM96地球重力场模型校正DEM数据中的高程偏差。通过对比WGS84椭球面与大地水准面的差异,解释了校正原理,并提供了从在线工具快速验证到Python脚本批量处理的全流程实战指南,帮助GIS开发者和数据分析师确保高程数据基准一致,提升空间分析精度。

ttt77的博客 1007

Muduo库实战:构建高性能TCP服务器的完整指南

本文详细介绍了如何使用Muduo库构建高性能TCP服务器,涵盖环境配置、核心架构、性能优化等关键环节。Muduo库基于C++11,采用Reactor模式和多线程架构,特别适合高并发场景。通过核心代码剖析和实战示例,帮助开发者快速掌握TCP服务器开发技巧。

weixin_33692284的博客 246

通信算法之320:DJI无人机云哨--信息包类型

大疆DJI无人机的云哨信息包主要分为四种类型:1)含经纬度位置、型号及序列号的完整数据包;2)仅含序列号的简化数据包;3)完全加密的数据包;4)加密密钥包。这些信息包格式不同,解析方式和应用场景也各异。如需更详细的技术资料,可联系作者获取。

leegang12的专栏 760

muduo网络库:18---muduo简介之(muduo库的由来、编译安装、目录结构、代码结构、线程模型)

一、由来 2010年3月我写了一篇《学之者生,用之者死——ACE历史与简 评》1,其中提到“我心目中理想的网络库”的样子: ·线程安全,原生支持多核多线程。 ·不考虑可移植性,不跨平台,只支持Linux,不支持Windows。 ·主要支持x86-64,兼顾IA32。(实际上muduo也可以运行在ARM 上。) ·不支持UDP,只支持TCP。 ·不支持IPv6,只支持IPv4。 ·不考虑广域网应...

董哥的黑板报 5711

【大模型应用开发-大模型知识】(二)大模型分类和常见大模型

目前包含 Claude 和 Claude-Instant 两种模型可供选择,其中 Claude Instant 的延迟更低,性能略差,价格比完全体的 Claude-v1 要便宜,两个模型的上下文窗口都是 9000 个token(约 5000 个单词,或 15 页)它的目标是“更安全”、“危害更小”的人工智能。Google 还开发了多种 PaLM 的改进版本。更强大的基础模型: ChatGLM3-6B 的基础模型 ChatGLM3-6B-Base 采用了更多样的训练数据、更充分的训练步数和更合理的训练策略。

1万+

【软考中级】多媒体应用设计师复习笔记第十章【free】

第10章法律法规与标准规范 行业标准 缩写的大写拼音 地方标准 DB加生代码 企业标准Q加斜线企业代号国际标准是国际标准化组织ISO和国际电工委员会IEC制定的标准 国家标准是由国务院标准化行政主管部门制定,全国范围内使用 ?强制性国家标准的代号为GB,推荐性国家标准的代号为GB/T。 ?软件开发规范GB8566-88属于强制性国家标准 在这里插入图片描述 行业标准代号由大写汉语拼音字母组成,加上斜线和T,组成推荐性行业标准,如XX/T。已经发布的行业代号有QJ(航天),SJ(电子

weixin_47120900的博客 641

Muduo常用接口

Muduo 是一个基于 C++ 的高性能、非阻塞 I/O 的网络库,主要用于处理高并发的网络通信。它封装了 Linux 上的 epoll 和 pthread,实现了事件驱动的网络编程模型。Muduo 的设计理念是将网络 I/O 与业务逻辑解耦,通过 Reactor 模型来管理 I/O 事件。在 Muduo 中,主要有以下几类接口和类: 是 Muduo 的核心类之一,它代表了一个事件循环。每个线程都有一个 ,并且每个 负责处理自己的 I/O 事件和定时器。 2. TcpServer 是 Muduo

TsuanS13的博客 1753

基于AnimeGAN模型生成宫崎骏风格动漫照片

用于动画风格纹理和线条转换的灰度样式丢失;新颖的颜色重建损失,以保留内容图像的颜色;新的灰度对抗损失防止生成的图像从显示为灰度图像;使用深度可分卷积和反向残块的轻量级生成器,以实现更快的传输。实验表明,AnimeGAN可以对真实世界的照片进行变换场景动画风格的图像与高质量的动画视觉效果和显著优于最先进的风格化方法。# 生成宫崎骏风格图片 model = hub . Module('animegan_v1_hayao_60' , use_gpu = True)images:输入的图片数据。

优快云 精品推荐 3630

C++Muduo网络库初探

在网络I/O中,如果队每个连接都用一个独立的线程来处理,会导致大量的线程资源消耗。因此,出现了一种能够使用一个线程来监听所有网络连接的I/O事件的方法 —— I/O多路复用。常见的I/O复用方法:select、poll、epoll。其中,epoll是一种事件驱动的I/O多路复用的方法。事件驱动的核心是,以事件为连接点,当有IO事件准备就绪时,以事件的形式通知相关线程进行数据读写,进而业务线程可以直接处理这些数据,这一过程的后续操作方,都是被动接收通知,看起来有点像回调操作。

shenfenxihuan的博客 5525

罗克韦尔AB PLC_FactoryTalk无法登录的解决方法

罗克韦尔AB PLC_FactoryTalk无法登录的解决方法

Robot_PLC_HMI_Automation 3575

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

陈硕《网络编程实战》00 前言

陈硕《网络编程实战》 84 课程总结 【草稿】 站在巨人的肩膀之上,还要抓牢,不要掉下去。 按照录像整理,版权归陈硕大神。 一开始,我是不知道陈硕有这本书的,实在是汗颜,写视频笔记的时候,内心是矛盾的,一方面是因为不知道这样做是否有侵犯版权问题,另一方面,也担心视频是否有版权问题。 总之,事情已经开始做了,一切就听天由命吧。[2020/12/25 2339 by Stark.New] Linux多线程服务端编程:使用muduo C++网络库 作者:陈硕 著 出版社:...

seaboys1971的专栏 2432

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

什么是 Muduo

简单介绍Muduo是一个用C++写的高性能网络库,主要用于开发高并发的服务器程序,比如聊天服务器、股票交易系统、游戏服务器等等。它的目标是让开发者更方便地写出高效、稳定的服务器程序。什么是 Boost?Boost是C++的一组开源的、经过严格测试的库,它提供了很多实用的工具和功能,类似C++的“标准库的增强版”。Boost的许多组件都在不断被C++标准采纳(比如智能指针、正则表达式、线程支持等),它也为开发者提供了丰富的工具来简化编程。Boost:像一把瑞士军刀,里面有许多工具帮你处理复杂的事情。

2301_80355452的博客 1158

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

[项目设计]仿muduo网络库实现高性能服务器组件

项目是仿muduo库One Thread One Loop式主从Reactor模型实现高并发服务器 通过实现的高并发服务器组件,可以简洁快速的完成⼀个高性能的服务器搭建。

a_zhee1的博客 1598

项目:仿muduo库One-Thread-One-Loop式并发服务器

仿muduo库One-Thread-One-Loop式并发服务器的组件

海绵宝宝de派小星的博客 13万+

别再自己造轮子了!用Muduo网络库5分钟搞定一个C++回显服务器(附完整代码)

本文介绍了如何使用Muduo网络库在5分钟内快速构建一个C++回显服务器,避免重复造轮子。Muduo作为专为Linux优化的高性能网络库,提供了简洁的API和清晰的线程模型,大幅提升开发效率。文章包含完整代码示例、环境配置指南及扩展建议,帮助开发者快速上手网络编程。

weixin_29587015的博客 250

深挖C++:类和对象(中)

(先进后出)

xys_678的博客 245
上一篇: 【C++】Json库介绍和使用
下一篇: 【C++】C++11之Lambda
e直在momo想你的Frank
博客等级 码龄2年 120粉丝 74原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值