(muduo) 基础demo

介绍

原项目:

GitHub - chenshuo/muduo

环境安装方式:

C++ muduo网络库知识分享01 - Linux平台下muduo网络库源码编译安装

陈硕B站:

bnu_chenshuo的个人空间-bnu_chenshuo个人主页-哔哩哔哩视频 (bilibili.com)

Chen Shuo’s Homepage

muduo 是一个在linux下的网络库。不跨平台。

该库还是比较知名的,但是由于历史遗留问题,要依赖boost库等问题。

有过一定的诟病,但是最为学习来说还是不错的,muduo库在实际项目中使用的人多吗? - 知乎 (zhihu.com)

Code

服务端code

/**
 * muduo网络库给用户提供了两个主要的类
 * TcpServer
 * TcpClient
 *
 * epoll + 线程池
 * 好处:能够把网络I/O的代码和业务逻辑代码分开
 *  用户的连接与断开
 *  用户的读写事件
 */
#include <muduo/net/EventLoop.h>
#include <muduo/net/TcpServer.h>

#include <functional>
#include <iostream>
#include <string>

using namespace muduo;
using namespace muduo::net;

/**
 * 基于muduo网络库开发服务端程序
 * 1. 组合TcpServer对象
 * 2. 创建EventLoop事件循环对象的指针
 * 3. 明确TcpServer构造函数需要什么参数,输出ChatServer的构造函数
 * 4.
 * 在当前服务器类的构造函数当中,注册处理连接的回调函数和处理读写事件的回调函数
 * 5. 设置合适的服务端线程数量,muduo会自动分配IO线程和worker线程
 */
class ChatServer {
public:
    /**
     * @brief Construct a new Chat Server object
     *
     * @param loop 事件循环
     * @param listenAddr 监听端口
     * @param nameArg 命名
     */
    ChatServer(EventLoop* loop, const InetAddress& listenAddr,
               const string& nameArg)
        : _server(loop, listenAddr, nameArg), _loop(loop) {
        // 给服务器注册用户连接的创建和断开回调
        _server.setConnectionCallback(
            std::bind(&ChatServer::onConnection, this, _1));

        // 给服务器注册用户读写回调
        _server.setMessageCallback(
            std::bind(&ChatServer::onMessage, this, _1, _2, _3));

        // 设置服务器的线程数量 1个IO线程 3个worker线程
        _server.setThreadNum(4);
    }

    void start() {
        std::cout << "Muduo Server Start" << std::endl;
        _server.start();
    }

private:
    /**
     * 专门处理用户的连接创建和断开
     * epoll listenfd accept
     */
    void onConnection(const TcpConnectionPtr& conn) {
        // 连接成功
        if (conn->connected()) {
            std::cout << conn->peerAddress().toIpPort() << " -> "
                      << conn->localAddress().toIpPort() << " state:online "
                      << std::endl;
        }
        // 连接失败
        else {
            std::cout << conn->peerAddress().toIpPort() << " -> "
                      << conn->localAddress().toIpPort() << " state:offline "
                      << std::endl;

            // close(fd)
            conn->shutdown();
            // _loop->quit();
        }
    }

    /**
     * @param coon 连接
     * @param buf 缓冲区
     * @param time 接受到数据的时间信息
     */
    void onMessage(const TcpConnectionPtr& conn, Buffer* buffer,
                   Timestamp time) {
        std::string buf = buffer->retrieveAllAsString();
        std::cout << "recv data: " << buf << "time: " << time.toString()
                  << std::endl;
        // 回声服务器
        conn->send(buf);
    }

private:
    TcpServer _server;
    EventLoop* _loop;  // epoll
};

int main() {
    EventLoop loop;
    InetAddress addr("127.0.0.1", 6000);
    ChatServer server(&loop, addr, "CharServer");

    // 启动服务
    server.start();
    // 以阻塞方式,等待事件
    loop.loop();

    return 0;
}

Makefile

SRC += server.cpp
TAR = server.out

${TAR} : ${SRC}
	g++			 	\
	$^ 				\
	-o 				\
	$@ 				\
	-lmuduo_net 	\
	-lmuduo_base 	\
	-lpthread

简单讲解

muduo网络库给用户提供了两个主要的类

  • TcpServer

  • TcpClient

epoll + 线程池

好处:能够把网络I/O的代码和业务逻辑代码分开

  • 用户的连接与断开

  • 用户的读写事件


muduo使用起来还是简单和模板的。

因为封装的比较好,直接设置回调即可。

该代码主要内容TcpServerEventLoop

分别管理服务和事件循环,并相关依赖。

End

一份简单的客户端代码见本文:

(libevent) 基础demo


当然可以直接用linux下的 telnet

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值