zoukankan      html  css  js  c++  java
  • Mudo C++网络库第七章学习笔记

    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开源库的作者云风大佬的博客;
  • 相关阅读:
    通过注册表选择文件默认打开方式
    oracle的imp和exp
    oracle 10g正则表达式 REGEXP_LIKE 用法
    oracle varchar 和varchar2的区别
    Oracle lower(Upper)函数|大小写|
    NC资金管理对外付款自动选上“网上支付”设置
    wmsys.wm_concat的几个用法
    GridView使用初步
    JavaScript学习笔记(一)—细节问题
    图片水印功能
  • 原文地址:https://www.cnblogs.com/longjiang-uestc/p/9841981.html
Copyright © 2011-2022 走看看