#安装cmake
sudo apt-get install cmake
#安装boost
sudo apt-get install libboost-dev libboost-test-dev
#三个非必须的依赖库: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
编译:
tar zxf muduo-x.x.x.tar.gz
cd muduo/
./build.sh -j2 //编译muduo库和它自带的例子,生成的可执行文件和静态库文件位于 ../build
./build.sh install //以上命令将muduo头文件和库文件安装到 ../build/release-install/{include,lib},以便muduo-protorpc和muduo-udns等使用
在自己的程序中使用muduo
muduo是静态链接的C ++程序库,使用muduo库的时候,需要只设置好头文件路径(../build/release-install/include)状语从句:库文件路径(../build/release-install/lib)并链接相应的静态库文件(-lmuduo_net -lmuduo_base)即可。
muduo的源代码文件名与类名相同,例如ThreadPool类的定义是muduo / base / ThreadPool.h,其实现位于muduo / base / ThreadPool.cc。
基础库:(muduo /碱)
网络核心库:
muduo是基于反应器模式的网络库,其核心是个时间循环事件循环,用于响应计时器和IO事件。
网络库核心位于muduo / net和muduo / net / poller。
网络附属库:
附属模块位于muduo / net / {http,inspect,protorpc}等处
在使用的时候需要链接相应的库,例如-lmuduo_http,-lmuduo_inspect等等。
代码结构:
muduo的头文件分为客户可见和客户不可见两类。
以下是安装之后暴露的头文件和库文件,对于使用muduo库,只需要掌握5个关键类:
Buffer,Eventloop,TcpConnection,TcpClient,TcpServer
公开接口:
各个阶级的作用简介:
缓冲液:数据的读写通过缓冲进行,用户代码不需要调用读()/写(),只需要处理收到的数据和准备要发送的数据。
InetAddress类:封装的IPv4地址,不能解析域名因为直接用的gethostbyname解析域名会阻塞IO线程。
事件循环:事件循环(反应器的反应器),每个线程只能有一个事件循环实现,负责IO和定时器事件的分派。
EventLoopThread:启动一个线程,在其中运行事件循环::环路();
TcpConnection:整个网络库的核心,封装一次TCP连接注意它不能发起连接。
的TcpClient:用于编写网络客户端,能发起连接,并且有重试功能。
TCPSERVER:用于编写网络服务器,接受客户的连接。
内部实现:
通道是可选择的IO通道,负责注册与响应IO事件。
Socket是一个RAII手柄,封装一个fd,分构时关闭fd。它是Acceptor,TcpConnection的成员,生命期由后者控制。
SocketsOps封装各种Sockets系统调用。
Poller是PollPoller和EPollPoller的积累。它是EventLoop的成员。
PollPoller和EPollPoller封装轮询和epoll两种IO多路复用后端。
Connector用于发起TCP连接,是TcpClient的成员。
Acceptor用于接受TCP连接,是TcpServer的成员。
TimerQueue用timerfd实现定时,有别于传统的设置poll / epoll_wait的等待时长的办法。
EpollLoopThreadPool用于创建IO线程池,用于把TcpConnection分派到某个事件循环线程上。是TCPSERVER的成员。
muduo的线程模型符合每个线程一个循环+线程轮询模型。每个线程最多有一个EventLoop,每个TcpConnection必须归某个EventLoop管理,所有的IO会转移到这个线程。一个fd只能由一个线程读写。
TcpServer直接支持多线程,它有两种模式:
1.单线程,接受与TcpConnection用同一个线程做IO。
2.多线程,接受与事件循环在同一个线程,另外创建一个EventLoopThreadPool,新连接会按循环方式分配到线程池中。
TCP网络编程最本质的是处理三个半事件:
1.连接的建立,包括服务端接受(accept)新连接和客户端成功发起(connect)连接。TCP连接一旦建立,客户端和服务端是平等的,可以各自收发数据。
2.连接的断开,包括 主动断开(close,shutdown) 和 被动断开(read()返回0)。
3.消息到达,文件描述符可读。对它的处理方式决定网络编程的风格。
3.5 消息发送完毕,这算半个。(发送完毕是指将数据写操作系统的缓冲区,不代表对方已经收到数据)