C++搭建集群聊天室(二):安装muduo网络库

举报
看,未来 发表于 2021/08/19 16:15:31 2021/08/19
【摘要】 @[toc] 资源下载==提取码: fid9==常规操作啦,前面两三篇都是环境搭建。muduo网络库我就不多做介绍了,一个基于reactor反应堆模型的多线程C++网络库,陈硕大神的作品,不了解的小伙伴可以自行了解一下。也可以去GitHub上自行下载。muduo库是基于boost开发的,所以需要先在Linux平台上安装boost库,安装boost库的方法:搁这儿呢此外,muduo的编译是通过...

请添加图片描述

@[toc]

资源下载

==提取码: fid9==

常规操作啦,前面两三篇都是环境搭建。
muduo网络库我就不多做介绍了,一个基于reactor反应堆模型的多线程C++网络库,陈硕大神的作品,不了解的小伙伴可以自行了解一下。

也可以去GitHub上自行下载。

muduo库是基于boost开发的,所以需要先在Linux平台上安装boost库,安装boost库的方法:搁这儿呢

此外,muduo的编译是通过CMAKE来执行的,所以我们还需要安装CMAKE。
安装命令就不用我多说了吧。。

CentOS下:

yum install cmake

确保那个压缩包已经在Linux下了吗?我们开始。


安装过程

unzip muduo-master.zip
cd muduo-master
./build.sh
./build.sh install

一气呵成,一马平川,畅通无阻。

但是呢,上面的install命令并没有把它们拷贝到系统路径下,导致我们每次编译程序都需要指定muduo库的头文件和库文件路径,很麻烦,所以我们选择直接把inlcude(头文件)和lib(库文件)目录下的文件拷贝到系统目录下:

现在,我们来对准一下目录,干点事情:

XXXXXXXX/build/release-install-cpp11/include

我不管你现在在哪个目录下,进入到这个目录下,我们开始:

mv muduo/ /usr/include/
cd ../lib
mv * /usr/local/lib/

拷贝完成以后使用muduo库编写C++网络程序,不用在指定头文件和lib库文件路径信息了,因为g++会自动从/usr/include和/usr/local/lib路径下寻找所需要的文件。


测试muduo是否安装成功

使用muduo库编写一个简单的echo回显服务器,测试muduo库是否可以正常使用,代码如下:

#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();
}

这里的编译要注意,使用了两个外库:
-lmuduo_net -lmuduo_base -lpthread

g++ muduo_test.cpp -o muduo_test -lmuduo_net -lmuduo_base -lpthread -std=c++11

运行结果:

一串时间 一个数字 INFO  pid = 还是那个数字 - muduo_test.cpp:61

等待客户端连接,可以打开一个新的shell命令行用netcat命令模拟客户端连接echo服务器进行功能测试,命令如下:

输入:echo "hello world" | nc localhost 8888

回显:hello world

客户端数据回显正确,看看服务器接日志信息打印如下:

时间 XXX INFO  pid = XXX - muduo_test.cpp:61
时间 XXX INFO  TcpServer::newConnection [EchoServer] - new connection [EchoServer-0.0.0.0:端口A一个#1] from 127.0.0.1:端口B一个 - TcpServer.cc:80
时间 XXX INFO  EchoServer - 127.0.0.1:端口B一个 -> 127.0.0.1:端口A一个 is UP - muduo_test.cpp:42
时间 XXX INFO  EchoServer-0.0.0.0:8888#1 echo 12 bytes, data received at 数字一串 - muduo_test.cpp:53

到此,muduo安装成功,能够正常进行C++网络程序开发!

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。