1.限制服务器最大并发连接数
-
MuduoManual.pdf P108
-
eg测试:47\jmuduo\examples\maxconnection\main.cc
47\jmuduo\examples\maxconnection\echo.h
47\jmuduo\examples\maxconnection\echo.cc -
测试:
回射服务器
回射客户端,使用nc测试
第一个连接
第二个连接
第三个连接
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
服务端,处于9,说明是10s超时;tail向前移动connectionBuckets_.push_back(Bucket());,其生命期就变为了9s
引用计数=0时,断开连接
此外,一个阁子可以存放多个连接。若开启了2个客户端,则服务端的定时器状态如下,一个阁子可以存放多个连接。
-
eg:47\jmuduo\examples\idleconnection\sortedlist.cc
-
测试:服务器端
客户端,使用nc测试