一、muduo库的安装
1. 安装依赖文件
muduo采用CMake为build system,安装方法如下:
- 安装cmake:
sudo apt-get install cmake
muduo依赖于Boost,也很容易安装:
- 安装boost库
sudo apt-get install libboost-dev libboost-test-dev
muduo有三个非必需的依赖库:curl、c-ares DNS、Google Protobuf,如果安装了这三个库,cmake会自动多编译一些示例。安装方法如下:
sudo apt-get install libcurl4-openssl-dev libc-ares-devsudo apt-get install protobuf-compiler libprotobuf-dev
2. 安装muduo库
muduo项目地址:https://github.com/chenshuo/muduo
- 在github上下载released版的 muduo.tar.gz : https://github.com/chenshuo/muduo/archive/refs/tags/v2.0.2.tar.gz
- muduo编译方法很简单(以muduo-0.8.2-beta.tar.gz为例):
- 解压
tar zxf muduo-0.8.2-beta.tar.gz - 进入muduo目录
cd muduo/ - 执行shell脚本编译文件
./build.sh -j2
编译muduo 库和它自带的例子,生成的可执行文件和静态库文件
分别位于…/build/debug/{bin,lib} - 安装编译后的文件
./build.sh install
以上命令将muduo 头文件和库文件安装到…/build/debug-install/{include,lib},以便muduo-protorpc 和muduo-udns 等库使用
- 解压
如果要编译release版(以-O2优化),可执行:
$ BUILD_TYPE=release ./build.sh -j2编译muduo 库和它自带的例子,生成的可执行文件和静态库文件分别位于…/build/release/{bin,lib}
BUILD_TYPE=release ./build.sh install
以上命令将muduo 头文件和库文件安装到…/build/release-install/{include,lib},以便muduo-protorpc 和muduo-udns 等库使用
在muduo 1.0正式发布之后,BUILD_TYPE的默认值会改成release。
编译完成之后请试运行其中的例子,比如bin/inspector_test,然后通过浏览器访问http://10.0.0.10:12345/或http://10.0.0.10:12345/proc/status,其中10.0.0.10替换为你的Linuxbox的IP。
3. 在自己的程序中使用muduo
muduo是静态链接的C++程序库,使用muduo库的时候,只需要设置好头文件路径(例如…/build/debug-install/include)和库文件路径(例如…/build/debug-install/lib)并链接相应的静态库文件(-lmuduo_net -lmuduo_base)即可。下面这个示范项目展示了如何使用CMake和普通makefile编译基于muduo的程序:https://github.com/chenshuo/muduo-tutorial
二、muduo编程示例
muduo库自带有一些编程示例。
1. echo服务的实现源码
echo.h
#ifndef MUDUO_EXAMPLES_SIMPLE_ECHO_ECHO_H
#define MUDUO_EXAMPLES_SIMPLE_ECHO_ECHO_H
#include "muduo/net/TcpServer.h"
// RFC 862
class EchoServer // echo类设计
{
public:
EchoServer(muduo::net::EventLoop* loop,
const muduo::net::InetAddress& listenAddr);
void start(); // calls server_.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_;
};
#endif // MUDUO_EXAMPLES_SIMPLE_ECHO_ECHO_H
echo.cc
#include "examples/simple/echo/echo.h"
#include "muduo/base/Logging.h"
//占位符 _1用于代替回调函数中的第一个参数, _2用于代替回调函数中的第二个参数。。
using std::placeholders::_1;
using std::placeholders::_2;
using std::placeholders::_3;
// using namespace muduo;
// using namespace muduo::net;
EchoServer::EchoServer(muduo::net::EventLoop* loop,
const muduo::net::InetAddress& listenAddr)
: server_(loop, listenAddr, "EchoServer")
{
server_.setConnectionCallback(
std::bind(&EchoServer::onConnection, this, _1));
server_.setMessageCallback(
std::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);
}
main.cc
#include "examples/simple/echo/echo.h"
#include "muduo/base/Logging.h"
#include "muduo/net/EventLoop.h"
#include <unistd.h>
// using namespace muduo;
// using namespace muduo::net;
int main()
{
LOG_INFO << "pid = " << getpid();
muduo::net::EventLoop loop;
muduo::net::InetAddress listenAddr(2007);
EchoServer server(&loop, listenAddr);
server.start();
loop.loop();
}
注:muduo库编译、安装过之后会产生一个 build 目录。
在该目录下存放这我们编译完之后生成的可执行程序和库。

2.1.1 执行 echo 程序(bin/…)
如果我们想运行给 echo 程序,可以直接到 muduo安装目录/build/release-cpp11/bin 下执行 simple_echo 即可。

2.1.2 执行 echo 程序(g++编译)

- 其中,
-L指定库目录,安装目录/build/release-cpp11/lib,-I指定头文件目录,安装目录/muduo-2.0.2/,以及使用-l库名的方式链接库。
2.1.3 执行效果

在浏览器输入 0.0.0.0:2007 模拟客户端访问,echo程序有如下输出:
或者使用 netcat 模拟连接
客户端发送“hello”,echo服务接收后返回“hello”给客户端。
客户端断开连接。