文章目录

  • ​​1.限制服务器最大并发连接数​​
  • ​​2.用Timing wheel踢掉空闲连接​​

1.限制服务器最大并发连接数

  • MuduoManual.pdf P108
  • eg测试:47\jmuduo\examples\maxconnection\main.cc
    47\jmuduo\examples\maxconnection\echo.h
    47\jmuduo\examples\maxconnection\echo.cc
  • 测试:
    回射服务器
  • (P47)muduo库使用例子(六):限制服务器最大并发连接数,用Timing wheel踢掉空闲连接_服务器

  • 回射客户端,使用nc测试
    第一个连接
  • (P47)muduo库使用例子(六):限制服务器最大并发连接数,用Timing wheel踢掉空闲连接_客户端_02

  • 第二个连接
  • (P47)muduo库使用例子(六):限制服务器最大并发连接数,用Timing wheel踢掉空闲连接_服务器_03

  • 第三个连接
  • (P47)muduo库使用例子(六):限制服务器最大并发连接数,用Timing wheel踢掉空闲连接_服务器_04

2.用Timing wheel踢掉空闲连接

  • MuduoManual.pdf P122 (1)粗暴方法1:注册一个每过一秒钟,重复执行的定时器 EventLoop::runEvery(…); 每隔一秒钟,执行以下的代码。遍历整个连接列表,判断是否超时,如果超时,就断开。
foreach(connection int connectionList)
{
if ((now - connection.lastReceiveTime) > 8s)
close(connection);
}

  • (2)粗暴方法2:
    为每个连接注册一个一次性的定时器,超时时间为8s。
    close(connection);
    (3)总结如下:
    如果是8s钟,那么该循环队列就有8个格子(8个桶bucket);
    这个循环队列只有1个尾指针tail;
    尾指针tail同样也需要注册一个1s钟的定时器,而且是重复的定时器,每过1s钟,tail向前移动一格,所以尾指针所指向的位置(即里面的连接),其超时时间就是8s钟;
    若时间轮盘的一个阁子只能存放一个连接的话,那么最多只能支持最多8个并发连接,而我们的并发连接数肯定远远大于8个连接,所以一个阁子存放的连接数不止一个,可以是一个集合。
  • eg测试:47\jmuduo\examples\idleconnection\echo.h
    47\jmuduo\examples\idleconnection\echo.cc
    47\jmuduo\examples\idleconnection\main.cc
    注意数据结构:shared_ptr,weak_ptr;链表,环形缓冲区,hash_set,以及排序链表的使用
  • 测试:
    客户端,超时时间是10s
  • (P47)muduo库使用例子(六):限制服务器最大并发连接数,用Timing wheel踢掉空闲连接_连接数_05

  • 服务端,处于9,说明是10s超时;tail向前移动connectionBuckets_.push_back(Bucket());,其生命期就变为了9s
  • (P47)muduo库使用例子(六):限制服务器最大并发连接数,用Timing wheel踢掉空闲连接_服务器_06


  • (P47)muduo库使用例子(六):限制服务器最大并发连接数,用Timing wheel踢掉空闲连接_客户端_07

  • 引用计数=0时,断开连接
  • (P47)muduo库使用例子(六):限制服务器最大并发连接数,用Timing wheel踢掉空闲连接_服务器_08

  • 此外,一个阁子可以存放多个连接。若开启了2个客户端,则服务端的定时器状态如下,一个阁子可以存放多个连接。
  • (P47)muduo库使用例子(六):限制服务器最大并发连接数,用Timing wheel踢掉空闲连接_连接数_09

  • eg:47\jmuduo\examples\idleconnection\sortedlist.cc
  • 测试:服务器端
  • (P47)muduo库使用例子(六):限制服务器最大并发连接数,用Timing wheel踢掉空闲连接_连接数_10


  • (P47)muduo库使用例子(六):限制服务器最大并发连接数,用Timing wheel踢掉空闲连接_连接数_11

  • 客户端,使用nc测试
  • (P47)muduo库使用例子(六):限制服务器最大并发连接数,用Timing wheel踢掉空闲连接_服务器_12