服务器端高并发IO的keep alilve方案

案例一、服务器端高并发IO的keep alilve方案,满足一下几个需求
1. 每个IO都有自己的时间戳
2. 每个IO收到自己的beat后,重置自己的定时器
3. 若IO定时没有收到,则执行IbeatO的回调函数,并重置定时器
4. 若再次没有收到beat,销毁IO,注销定时器。

首先建立一个时间红黑树,红黑树每个节点包括时间戳,超时回调函数,连接描述符,在线程的主循环中,每次遍历红黑树找到超时的节点,然后执行超时回调函数,并且从该红黑树中删除该节点。
新连接来到的时候通过epoll来接受连接,然后建立一个事件放到一个消息队列里面,在检测红黑树的线程每次在遍历红黑树之前先从该消息队列取事件,如果有需要加入红黑树的事件,则执行插入红黑树的操作,插入完成后执行查找红黑树 超时的I节点。其中红黑树插入一个新节点的时间复杂度为 log(N),遍历的时间复杂度为O(N)
type struct MQNode
{
int fd;
int type;
int timeStap;
}
void startNetThread()
{
//使用epoll接受网络IO
//如果是新连接,消息类型为新连接,放入消息队列
int type = 1;
//消息对列节点
MQNode* node;
//fd为连接描述符
node->:fd = fd;
node->timeStap = 当前时间;
if( newClient )
{
type = 1
}
//否则,消息类型为老连接,放入消息队列
else
{
type = 2
}
putMq(node)
}

void putMq((MQNode* node)
{
//插入消息队列链表
}
//从消息队列拿出节点,操作红黑树
void startRBTreeThread()
{
//构建新的红黑树
while(ture)
{
//从消息队列拿出节点,
//判断类型如果是新连接,则插入红黑树
//否则,则遍历红黑树,修改节点的时间戳,重构红黑树
//遍历红黑树看是否有过期的节点,如果有则调用IO销毁函数
//并且从红黑树中删除该节点
}

}

//测试代码后续补上。。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值