Echo库

Echo网络库

概要说明
源码分析
使用方法

概要说明

  1. Echo借鉴了大量muduo的代码,并对其进行简化。
  2. Echo体现了现代C++两大风格,一是事件回调,我们使用function/bind实现回调机制,用户只需要向其注册回调函数即可,必要时可以封装成class,二是采用智能指针进行资源管理,例如TcpConnection使用了shared_ptr管理其生命周期,其他类采用了unique_ptr借助其销毁功能
  3. Echo不足之处:
  • 对错误的处理比较粗糙
  • 没有使用一个比较规范的日志
  1. Echo与muduo的主要差距
  • Echo没有实现复用同一个Poller的功能,这正式muduo中的EventLoop,里面封装了一个通用的Poll、Epoll模型
  • 我们采用的是阻塞IO,不能成为严格意义上的Reactor模式,而且我们没有实现缓冲区
  • 大量的实用技巧

源码分析

  1. NonCopyable、Copyable表示对象是否具有value语义,Echo中除了InetAddress之外,其余均禁用掉了value语义,这事为了避免潜在的BUG。
  2. Exception相比标准库的exception,增加了打印栈痕迹的功能
  3. ThreadPool系列,主要包含MutexLock、Condition、Thread、ThreadPool。其中大量采用了RAII技术,避免资源的泄漏,对于Thread和ThreadPool,我们采用了function作为泛型技术,用户只需注册回调函数
  4. Timer,内部采用timerfd系列的定时器,不使用信号,而是使用fd可读作为定时器的触发事件,这使得Timer可以加入到IO复用模型,我们采用的是Poll模型。也可以单独把Timer放到一个线程,这就是TimerThread的产生
  5. TcpServer系列:
  • Rio封装可网络编程中的三个函数readn、readLine、writen
  • Socket则封装了基本的socket操作,但是不包含读写
  • InetAddress包装了sockaddr_in结构体,使之更易使用
  • TcpConnection则包装了Tcp连接的各种操作,主要是数据的收发以及获取Tcp连接的信息。TcpConnection采用shared_ptr管理其生存期,还继承了enable_shared_from_this,用于在类的内部获取自己的智能指针
  • PollPoller封装了Poll模型,内部存在一个map<int, tcpconnectionptr="">实现从文件描述符到Tcp连接的映射
  • TcpServer则是对以上组件的组合
  1. 用户注册事件与回调流程
  • 先注册给TcpServer,然后是PollPoller,之后是TcpConnection,这样完成了事件的注册
  • 回调函数由PollPoller触发,通过map寻找到Tcp连接,然后调用里面的回调函数
  1. TcpServer实质是一个IO复用模型,ThreadPoll则是代笔多进程。用户在使用时,可以只选择其一。如果计算任务负担较重,可以将计算任务与Tcp回发封装成函数,交给线程池去计算
  2. 此时,运行TcpServer的线程是一个IO线程,ThreadPool里面的线程专注于CPU密集型计算

使用方法见example文件夹

  • 只使用TcpServer,适用于计算任务很轻的情况
  • 在代码中组合TcpServer和ThreadPool,把计算任务(和Tcp回发)分发到线程池中,适合于计算任务较重的情况

安装方法

  • 执行make,生成echo头文件和静态库libecho.a
  • 将echo安装到/usr/include/下,将libecho.a放置/usr/lib/下
  • 编译的时候加上-std=c++0x -lecho -lpthread
posted @ 2014-08-08 17:26  Abbey  阅读(189)  评论(0编辑  收藏  举报