muduo编程示例

  • muduo库是设计来开发内网的网络程序, 它没有做任何安全方面的加强措施, 如果在公网上可能会受到攻击;
  • muduo库把主动关闭连接这件事分成两步来做:
    • 如果主动关闭连接, 会先关本地写端, 等对方关闭之后, 再关闭本地读端;

muduo Buffer类的设计与使用

  • muduo输入输出缓冲区的设计与实现;
  • Unix/Linux上的五种IO模型:
    • 阻塞(blocking);
    • 非阻塞(non-blocking);
    • IO复用(IO multiplexing);
    • 信号驱动(signal-driven);
    • 异步(asynchronous);
  • event loop 是non-blocking网络编程的核心, 在现实生活中, non-blocking几乎是和IO multiplexing(IO复用);
  • 为什么non-blocking网络编程中应用层buffer是必需的?
    • non-blocking IO的核心思想是避免阻塞在read()或write()或其他IO系统调用上;
    • IO线程只能阻塞在IO multiplexing函数上, 如select/poll/epoll_wait;
    • TCP是一个无边界的字节流协议;
    • 长度为n字节的消息分块到达的可能性有2(n-1)种;
  • muduo中的IO都是带缓冲的IO(buffered IO), 不会自己去read()或write()某个sockect, 只会操作TcpConnection的input buffer和output buffer;
    • 在onMessage()回调里读取input buffer;
    • 调用TcpConnection::send()来间接操作output buffer, 一般不会直接操作output buffer;

一种自动反射消息类型的Protobuf网络传输方案

  • 根据type name创建具体类型的Message对象;
  • 在muduo中实现protobuf编解码器与消息分发器;
  • codec的基本功能之一是做TCP分包: 确定每条消息的长度, 为消息划分界限

定时器

  • 获取当前时间, 计算时间间隔;
  • 时区转换与日期计算; 把纽约当地时间转换为上海当地时间;
  • 定时器操作, 比如在预定的时间执行任务, 或者在一段延时之后执行任务;
  • Linux时间函数:
    • Linux的计时函数, 用于获得当前时间:

      • time/time_t(秒);
      • ftime/stuct timeb(毫秒);
      • gettimeofday/stuct timeval(微妙);
      • clock_gettime/struct timespec(纳秒);
    • 定时函数:
      • sleep;
      • alarm;
      • usleep;
      • nanosleep();
      • clock_nanosleep();
      • getitimer/setitimer;
      • timer_create/timer_settime/timer_gettime/timer_delete;
      • timerfd_create/timerfd_gettime/timerfd_settime;
    • 计时, 只使用gettimeofday来获取当前时间;
      • clock_gettime精度最高, 但是其系统调用的开销比gettimeofday大;
      • gettimeofday在x86平台上不是系统调用, 而是在用户态实现的, 没有上下问切换和陷入内核的开销;
      • 一个64位的数可以计数达到30万年;
    • 定时, 只使用timerfd_*系列函数来处理定时任务;
      • timerfd_create把时间变成了一个文件描述符, 该文件在定时器超时的那一刻变得可读, 这样就可以方便地融入select/poll框架中;
      • 用统一的方式来处理IO事件和超时事件, 这也正是Reactor模式的长处;
      • poll和epoll_wait的定时器精度只有毫秒, 远低于timerfd_settime的定时精度;
    • Linux是一中非实时多任务操作系统;

用timing wheel踢掉空闲连接

  • 应该用心跳消息来判断对方进程是否能正常工作;

简单的消息广播服务

  • 在分布式中, 除了常用的end-to-end通信, 还有一对多的广播通信;
  • tcpdump需要root权限, 在客户端和server之间放一个中继器(relay);

短址服务

  • muduo内置了一个简陋的http服务器, 可以处理简单的HTTP请求;
  • 这个HTTP服务器是面向内网的暴露进程状态的监控端口, 不是面向公网的功能完善且健壮的httpd, 其接口与J2EE的HttpServlet有几分类似;
  • muduo库最核心的几个clsass:
    • TcpConnection类;
    • TcpServer类;
    • TcpClient类;
    • Buffer类;
    • Channel类 -- 是IO事件回调的分发器(dispatcher);
  • UDNS是一个stub DNS解析器, 它能够异步地发起DNS查询, 再通过回调函数通知结果;
  • c-ares DNS是一款常用的异步DNS解析库;
  • libcurl是一个常用的HTTP客户端库, 可以方便地下载HTTP和HTTPS数据;
    • libmicrohttpd -- 可嵌入的HTTP服务器;
    • libpg -- PostgreSQL的客户端库;
    • libdrizzle -- MySQL的非官方客户端库;
    • QuickFIX -- 常用的FIX消息库;
    • 为之提供muduo adapter;
  • 对每个TCP连接创建一个lua(一种脚本语言), muduo为lua提供通信机制;
    • 用lua来编写业务逻辑, 这样可以做到在线更改逻辑而不重启进程;
  • skynet开源库的作者云风大佬的博客;

Mudo C++网络库第七章学习笔记的更多相关文章

  1. Mudo C++网络库第六章学习笔记

    muduo网络库简介 高级语言(Java, Python等)的Sockects库并没有对Sockects API提供更高层的封装, 直接用它编写程序很容易掉到陷阱中: 网络库的价值还在于能方便地处理并 ...

  2. Mudo C++网络库第十一章学习笔记

    反思C++面向对象与虚函数 C++语言学习可以看<C++ Primer>这本书; 在C++中进行面向对象编程会遇到其他语言中不存在的问题, 其本质原因是C++ class是值语义, 而非对 ...

  3. Mudo C++网络库第四章学习笔记

    C++多线程系统编程精要 学习多线程编程面临的最大思维方式的转变有两点: 当前线程可能被切换出去, 或者说被抢占(preempt)了; 多线程程序中事件的发生顺序不再有全局统一的先后关系; 当线程被切 ...

  4. Mudo C++网络库第三章学习笔记

    多线程服务器的适用场合与常用编程模型 进程间通信与线程同步; 以最简单规范的方式开发功能正确.线程安全的多线程程序; 多线程服务器是指运行在linux操作系统上的独占式网络应用程序; 不考虑分布式存储 ...

  5. Mudo C++网络库第五章学习笔记

    高效的多线程日志 日志(logging)有两个意思: 诊断日志(diagnostic log), 常用日志库提供日志功能; 交易日志(transaction log), 用于记录状态变更, 通过回放日 ...

  6. 网络库Alamofire使用方法学习笔记

    Github地址 由于Alamofire是swift网络库,所以,以下的所有介绍均基于swift项目 导入Alamofire 以下为使用cocoapods导入,其余的方式请参考官网 source 'h ...

  7. Linux 第七章学习笔记

    1:链接概述 链接(linking)是将各种代码和数据部分收集起来并组合成为一个单一文件的过程,这个文件可被加载(或被拷贝)到存储并执行. 编译系统提供的调用预处理器.编译器.汇编器和链接器来构造目标 ...

  8. 《Metasploit魔鬼训练营》第七章学习笔记

    P314 木马程序的制作 msfpayload和msfencoder已被msfvenom取代.使用msfvenom -h查看具体用法.以下网址也有相关教程: https://github.com/ra ...

  9. apue第七章学习总结

    apue第七章学习总结 1.main函数 程序是如何执行有关的c程序的? C程序总是从main函数开始执行.main函数的原型是 int main(int argc,char *argv[]); 其中 ...

随机推荐

  1. python mysql 视图 触发器 事物 存储过程 用户授权 数据备份还原

    ###################总结########### 视图是一个虚拟表(非真实存在) 是跑在内存中的表,真实表是在硬盘上的表 使用视图我们可以把查询过程中的临时表摘出来,保存下来,用视图去 ...

  2. Ubuntu 云服务器上部署自己的 Rails 应用

    自学rails一段时间了,之前只用heroku部署了网站,想尝试把网站以一个更“正经”的方式呈现出来,就买了一个阿里云服务器.参考了网上部分rails部署教程,过程中也遇到了一些问题,所以在完成之后总 ...

  3. win7安装linux CentOS7双系统实践

    开发需求要安装linux,百度了些资料,当然仅供参考,否则入坑. 步骤一 :制作Centos 7镜像文件,这步没什么坑 1.准备U盘8G以上 下载的话网上很多,这里提供一个下载路径:​ http:// ...

  4. ES6 In Depth: Arrow functions

    Arrows <script language="javascript"> <!-- document.bgColor = "brown"; ...

  5. VScode 1.13 gocode提示dial tcp 216.239.37.1:443: connectex: A connection attempt failed because the connected..

    在将VScode升级至 1.13后让升级gocode,在升级时报出如下错误 D:\go_work\src>go get -u -v github.com/mdempsky/gocode gith ...

  6. ACM-ICPC 2018 徐州赛区网络预赛 I Characters with Hash(模拟)

    https://nanti.jisuanke.com/t/31461 题意 一个hash规则,每个字母映射成一个两位数,求给的字符串最后的编码位数,要求去除最终结果的前导零 分析 按题意模拟就是了 # ...

  7. HDU - 1255 覆盖的面积 (线段树求面积交)

    https://cn.vjudge.net/problem/HDU-1255 题意 给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积. 分析 求面积并的题:https://www.cnbl ...

  8. Spark源码剖析 - 任务提交与执行

    1. 任务概述 任务提交与执行过程: 1) build operator DAG:此阶段主要完成RDD的转换及DAG的构建: 2) split graph into stages of tasks:此 ...

  9. springBoot----aop--整合日志相关

    springBoot整合日志相关 1:新建log4j.properties文件 : log4j.properties: #log4j.rootLogger=CONSOLE,info,error,DEB ...

  10. luogu 2480 古代猪文 数论合集(CRT+Lucas+qpow+逆元)

    一句话题意:G 的 sigma d|n  C(n d) 次幂  mod 999911659 (我好辣鸡呀还是不会mathjax) 分析: 1.利用欧拉定理简化模运算 ,将上方幂设为x,则x=原式mod ...