muduo库介绍

  • content {:toc}

muduo库的优点

  1. 高性能:muduo 是一个基于事件驱动的网络库,具有高度可扩展性和高性能。它采用了 Reactor 模式和非阻塞 IO 技术,能够处理大量并发连接和高负载的网络请求,提供出色的性能表现。
  2. 轻量级:muduo 库设计简洁,代码量相对较小,不依赖于外部库和框架。这使得集成和使用该库非常方便,并且能够快速构建高性能的网络应用程序。

安装muduo库

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# 0.1 在下载路径下解压
unzip muduo-master.zip

# 0.2 如果没有安装 cmake
sudo apt-get install cmake

# 0.3 安装 boost库
sudo apt-get install libboost-dev libboost-test-dev

# 1 编译
./build.sh

# 2 安装 
./build.sh install


# 完成以后
# 会在 muduo 源码根路径的上一级路径下生成一个 build 目录(下面全文我们以../build 表示)
# 生成的可执行文件位于:../build/release-cpp11/bin
# 静态文件位于:../build/release-cpp11/lib

# 进入安装的地方
cd release-install-cpp11/

# 进入 include 文件夹, 文件夹下有个 muduo, 将其移动至后面的路径
cd include/
mv muduo/ /usr/include/

# 进入 lib 文件夹, 将内部所有的文件, 将其移动至
cd ../lib/
mv * /usr/local/lib/

编译测试

  • 要记得使用-pthread
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
// g++ main.cpp -lmuduo_net -lmuduo_base -lpthread -std=c++11
// ./a.out 
// 另一个 shell 进行
// echo "hello world" | nc localhost 8888
#include <muduo/net/TcpServer.h>
#include <muduo/base/Logging.h>
#include <boost/bind.hpp>
#include <muduo/net/EventLoop.h>

// 使用muduo开发回显服务器
class EchoServer
{
 public:
  EchoServer(muduo::net::EventLoop* loop,
             const muduo::net::InetAddress& listenAddr);

  void start(); 

 private:
  void onConnection(const muduo::net::TcpConnectionPtr& conn);

  void onMessage(const muduo::net::TcpConnectionPtr& conn,
                 muduo::net::Buffer* buf,
                 muduo::Timestamp time);

  muduo::net::TcpServer server_;
};

EchoServer::EchoServer(muduo::net::EventLoop* loop,
                       const muduo::net::InetAddress& listenAddr)
  : server_(loop, listenAddr, "EchoServer")
{
  server_.setConnectionCallback(
      boost::bind(&EchoServer::onConnection, this, _1));
  server_.setMessageCallback(
      boost::bind(&EchoServer::onMessage, this, _1, _2, _3));
}

void EchoServer::start()
{
  server_.start();
}

void EchoServer::onConnection(const muduo::net::TcpConnectionPtr& conn)
{
  LOG_INFO << "EchoServer - " << conn->peerAddress().toIpPort() << " -> "
           << conn->localAddress().toIpPort() << " is "
           << (conn->connected() ? "UP" : "DOWN");
}

void EchoServer::onMessage(const muduo::net::TcpConnectionPtr& conn,
                           muduo::net::Buffer* buf,
                           muduo::Timestamp time)
{
  // 接收到所有的消息,然后回显
  muduo::string msg(buf->retrieveAllAsString());
  LOG_INFO << conn->name() << " echo " << msg.size() << " bytes, "
           << "data received at " << time.toString();
  conn->send(msg);
}


int main()
{
  LOG_INFO << "pid = " << getpid();
  muduo::net::EventLoop loop;
  muduo::net::InetAddress listenAddr(8888);
  EchoServer server(&loop, listenAddr);
  server.start();
  loop.loop();
}
Licensed under CC BY-NC-SA 4.0
最后更新于 Oct 13, 2024 18:49 +0800
使用 Hugo 构建
主题 StackJimmy 设计