muduo网络库——简介:安装、目录结构

6.2安装

#安装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)即可。

6.3目录结构

muduo的目录结构如下:

muduo的源代码文件名与类名相同,例如ThreadPool类的定义是muduo / base / ThreadPool.h,其实现位于muduo / base / ThreadPool.cc。

基础库:(muduo /碱)

网络核心库:

   muduo是基于反应器模式的网络库,其核心是个时间循环事件循环,用于响应计时器和IO事件。

   网络库核心位于muduo / netmuduo / 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,新连接会按循环方式分配到线程池中。

6.4.1 TCP网络编程本质论

TCP网络编程最本质的是处理三个半事件

1.连接的建立,包括服务端接受(accept)新连接和客户端成功发起(connect)连接。TCP连接一旦建立,客户端和服务端是平等的,可以各自收发数据。

2.连接的断开,包括 主动断开(close,shutdown) 和 被动断开(read()返回0)。

3.消息到达,文件描述符可读。对它的处理方式决定网络编程的风格。

3.5 消息发送完毕,这算半个。(发送完毕是指将数据写操作系统的缓冲区,不代表对方已经收到数据)

猜你喜欢

转载自blog.csdn.net/amoscykl/article/details/83184906
今日推荐