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开源库的作者云风大佬的博客;
转载于:https://www.cnblogs.com/longjiang-uestc/p/9841981.html