1. 说明

记录web服务器项目中定时器关闭超时连接功能实现思路,使用基于双向链表的定时器队列,可以改进为小根堆结构。

2. 设计思路

建立一链表,链表节点即定时器结构体,升序存储定时器。定时器结构体中主要数据为:超时时间、socket连接对象信息、超时后的处理回调函数,用以在超时后,主动关闭该定时器对应的连接。

在socket连接类中,应当包含定时器结构体对象,记录该连接对应的定时器,用以在连接I/O操作后更新过期时间,同时更新双向链表中对应的定时器。

2.1 根据定时器主动控制socket连接

定时器的基本功能为定时检查链表中超时的连接,并关闭此连接。

在主程中,通过alarm函数每5s触发SIGALRM,修改SIGALRM缺省行为为:将信号加入管道。管道读端注册了EPOLLIN事件,因此加入的信号会在轮询epoll_event时被处理。

epoll_event检测到SIGALRM后,不能立即去检查超时定时器,因为I/O操作优先级要高于定时器事件,因此此刻只需标记一下,等待I/O操作结束后再处理定时器。

在链表中检出超时定时器后,要调用回调函数,将对应的连接关闭。

2.2 根据连接情况修改定时器

定时器反映的是连接的情况,因此当连接出现变化时,定时器也要进行修改。

具体情况有如下几类:产生新连接时,需要以当前时间设置新定时器;连接关闭时,需要剔除定时器;连接有I/O操作时,需要将对应定时器过期时间延后。

3. 相关细节

暂定定时器为链表结构,表中节点以升序排列,这样在找到一超时连接后,其后定时器都应当执行关闭连接操作,在变动表中节点时,要注意保持升序关系。