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

?

Echo库

时间: 2025-01-01 12:08:22

Echo库的相关文章

Android自己主动化构建之Ant多渠道打包实践(下)

前言 上一篇(Android自己主动化构建之Ant多渠道打包实践(上))已经介绍了Android的apk是怎样构建的,本篇博客继续Ant打包的实践过程. 集成友盟统计SDK 这里以友盟统计为例,对各个渠道进行统计.我们须要先集成它的SDK 配置权限 <!-- 权限 --> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" > </uses-permission&g

httpd-2.4.9编译安装与配置(CGI、虚拟主机、https、deflate压缩)

1.准备好软件: pcre及pcre-devel pcre是一个perl库,包含perl所兼容的正则表达式库.由于httpd服务具有CGI功能,而大多数的CGI都是基于perl的,所以需要安装这个库. apr-1.5.1 apr是Apache可移植运行库,此库可以使httpd跨平台使用.是Apache必须依赖的库.httpd-2.4的event模块apr必须是1.5.x以上的 apr-util-1.5.3 基于apr的更高级的库,名字类似是apr的工具 httpd-2.4.9 今天要编译配置的主

0806------Linux网络编程----------Echo 网络库 学习笔记

1.Echo网络库的编写 1.1 Echo网络库1.0 1.1.1 Echo网络库 1.0 框架分析 a)class InetAddress: 主要用来定义一个struct sockaddr_in 结构(用自定义端口号初始化),并提供获取这个结构体成员如IP.Port等的接口: b)class Socket : 主要用来把一个普通的 sockfd 变为 listenfd(这里用一个sockfd初始化对象),提供bind .listen.accept 等接口. c)class TcpConnect

简单的JavaScript图像延迟加载库Echo.js

插件描述:和 Lazy Load 一样,Echo.js 也是一个用于图像延迟加载 JavaScript.不同的是 Lazy Load 是基于 jQuery 的插件,而 Echo.js 不依赖于 jQuery 或其他 JavaScript 库,可独立使用.并且 Echo.js 非常小巧,压缩后不足 1KB. 兼容性 Echo.js 使用了 HTML5 的 date 属性,并且需要获取该属性的值,所以它并不兼容 IE6.IE7.虽然 Lazy Load 也使用了 HTML5 的 date 属性,但它

图片懒加载库echo.js源码学习

最近不是在学习设计模式吗,然后就看到了代理模式加载图片的样例,然后自己实现了一下,就发现,自己写的这货每次就只能加载一张图片,而且图片要放在哪也是个很严重的问题 然后就去了 gayhub 找了找了找流行的图片懒加载库,这一找,就找到了一个echo.j是,打开一看,源码只有100多行吧,震惊..,看完源码,哎,木有上代理模式呀 仔细学习了下源码:觉得这种做法比较适合图片位置确定场景的吧,比如文章啊,一篇文章老长了,里面有蛮多图片散落在不同的地方,这样就比较合适,有可能有很多图片读者都不会翻到哪里,

Golang Gin/Ace/Iris/Echo RBAC 鉴权库

GRBAC 项目地址: https://github.com/storyicon/grbac Grbac是一个快速,优雅和简洁的RBAC框架.它支持增强的通配符并使用Radix树匹配HTTP请求.令人惊奇的是,您可以在任何现有的数据库和数据结构中轻松使用它. grbac的作用是确保指定的资源只能由指定的角色访问.请注意,grbac不负责存储鉴权规则和分辨"当前请求发起者具有哪些角色",更不负责角色的创建.分配等.这意味着您应该首先配置规则信息,并提供每个请求的发起者具有的角色. grb

linux c: 静态库和动态库的生成和使用

场景: main函数需要两个接口,一个求和函数,一个打印函数. int sum(int i, int j); 求两个int数字的和. void show(int i, char* name); 打印i的值和它的名称. 现在,需要制作: 一个静态库libcalc.a,提供sum的接口; 一个动态库libshow.so,提供show的接口. #include <stdio.h> #include "calc.h" #include "show.h" int

MySQL5.6.12 Waiting for commit lock导致从库hang住的问题剖析

nagios报警,线上一台从库检测不到slave状态,于是远程上去查看问题: 1,show slave status\G卡住: Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> show slave status\G show slave status卡住了,动弹不了,这种情况还是第一次遇到. 2,看w负载无压力: [root@tmp3_72 ~]# w 13:23:31 u

用Vs2013+VELT进行Linux开发:动态库

快乐虾 http://blog.csdn.net/lights_joy/ 欢迎转载,但请保留作者信息 本文适用于vs2013 + Visual EmbedLinux Tools 0.1.1 1.1    什么是VELT VELT的全称是Visual EmbedLinuxTools,它是一个与visual gdb类似的visual studio插件,用以辅助完成Linux开发.利用这个插件,将可以在visual studio的IDE中进行Linux应用程序的开发(包括编译和调试),也可以进行ubo