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

Posted 看,未来

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++搭建集群聊天室:安装muduo网络库相关的知识,希望对你有一定的参考价值。

资源下载

提取码: 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++网络程序开发!

以上是关于C++搭建集群聊天室:安装muduo网络库的主要内容,如果未能解决你的问题,请参考以下文章

C++搭建集群聊天室:muduo网络库

C++搭建集群聊天室:muduo网络库

C++搭建集群聊天室:网络层代码与业务层代码(登录注册)解耦

C++搭建集群聊天室:网络层代码与业务层代码(登录注册)解耦

C++搭建集群聊天室:数据库代码及用户模型代码封装

C++搭建集群聊天室:数据库代码及用户模型代码封装