muduo C++网络库学习

一、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-dev
  • sudo apt-get install protobuf-compiler libprotobuf-dev
2. 安装muduo库

muduo项目地址:https://github.com/chenshuo/muduo

  1. 在github上下载released版的 muduo.tar.gz : https://github.com/chenshuo/muduo/archive/refs/tags/v2.0.2.tar.gz
  2. 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”给客户端。
在这里插入图片描述
客户端断开连接。
在这里插入图片描述


版权声明:本文为weixin_43919932原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。