1.muduo庫簡介
muduo是由Google大佬陳碩開發,是一個基于非阻塞IO和事件驅動的現代C++網絡庫,原生支持one loop per thread這種IO模型,該庫只支持Linux系統,網上大佬對其褒貶不一,作為小白用來學習就無可厚非了。
git倉庫:https://github.com/chenshuo/muduo
2.準備事項
- muduo采用Cmake為build system,安裝如下:
$ sudo apt-get install cmake
- muduo依賴于Boost,安裝如下:
$ sudo apt-get install libboost-dev libboost-test-dev
- curl、c-ares DNS、Google Protobuf這3個庫非必須安裝,如果安裝了cmake會多編譯一些示例,安裝如下:
$ sudo apt-get install libcur14-openssl-dev libc-ares-dev
$ sudo apt-get install protobuf-compiler libprotobuf-dev
3.編譯
- 下載muduo-master解壓后,執行編譯腳本
// 切換路徑
$ cd muduo-master/
//編譯muduo庫,默認release版,生成build文件夾
$ ./build.sh -j2
// 將muduo頭文件和庫文件安裝到release-install目錄下的include和lib文件夾
$ ./build.sh install
// 將頭文件拷貝到系統路徑
$ cd build/release-install-cpp11/include/
$ cp -r muduo/ /usr/local/include/
// 將庫文件拷貝到系統路徑
$ cd build/release-install-cpp11/lib/
$ cp * /usr/local/lib/
4.測試demo
- EchoServer.h
#include <muduo/net/TcpServer.h>
#include <muduo/base/Logging.h>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::EventLoop* loop_;muduo::net::TcpServer server_;};
- EchoServer.cpp
#include "EchoServer.h"
#include <boost/bind/bind.hpp>using namespace boost::placeholders;EchoServer::EchoServer(muduo::net::EventLoop* loop,const muduo::net::InetAddress& listenAddr):loop_(loop),server_(loop, listenAddr, "EchoServer"){server_.setConnectionCallback(boost::bind(&EchoServer::onConnection, this, _1));server_.setMessageCallback(boost::bind(&EchoServer::onMessage, this, _1, _2, _3));}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);
}void EchoServer::start()
{server_.start();
}
- test.cpp
#include "EchoServer.h"#include <muduo/net/EventLoop.h>
#include <muduo/base/Logging.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();
}
- 在編譯的時候出現好多未定義的錯誤,最后排查是因為編譯的時候鏈接庫的順序有要求,編譯如下:
$ g++ EchoServer.cpp test.cpp -o test -lmuduo_base -lmuduo_net -lpthread
錯誤消息如下:
5.測試
執行test.out程序啟動服務端,再通過終端模擬客戶端建立連接,在客戶端發送消息會同時接收服務端回復的相同消息。