首页 > 生活感悟 > 免费教学 > 写一个QQ——消息收发——epoll和连接管理

写一个QQ——消息收发——epoll和连接管理

发布时间:2024-11-23 17:41:18来源: 15210273549

昨天我用多线程加上accept和read两个阻塞函数编写了一个基本能处理多个连接的服务端;

但我们在理解了这样的服务器设计之后,凭常识可以很轻易地知道这样的服务器性能并不好;

性能不好的原因是我们监听是否有新连接的accept和每个监听是否有新消息的read都要独立使用一个线程;

 

我们是否有某种方法,将这些accept和read放在一起监听呢?来了新消息再用相对应的socket来进行处理呢。

 

epoll就是这样的一种处理模型,这种模型叫做事件模型,监听一堆的事件,然后发生某些事情时根据监听的事件,处理对应的函数。

 

我们要使用epoll的话,首先将库包含,同时处理函数稍微修改一点,(多线程暂时不用,先注释掉):

 

随后我们创建一个epoll,按照它的语法初始化它的一些参数(主要是我们的socket和监听我们socket的事情是读还是写);

随后写一个循环,用epoll_wait等待网络传过来的信号,如果有对应的信号就处理(连接信号就用accept接收并创立连接,收到消息就用我们的函数处理);

 

这里的epoll_wait最后一个参数是设置延迟等待时间的,假如设置为负数,那就是不等待,一直监听,直到等到了一个连接或者消息发送的事件,随后执行后面的代码。

这样的话,epoll_wait就变成了实质上的阻塞函数,假如我们要执行一些连接管理的事情(比如客户端太长时间没有消息就断开连接),就会因为一直卡在epoll_wait而执行不了。

因此我们加上延迟等待时间,设置为1000ms。

 

同时,我们来完成我们的连接管理:

我们需要一个数据结构来保存我们连接好的socket和最后消息时间,并且在每次循环中将超过一定时间没有发送消息的连接给断掉。

这个数据结构要能适应每次客户端发送消息时候,对于socket最后消息时间的更新,同时我们每次循环的时候对其进行遍历,断开超时的连接以节省服务器资源;

我们使用map,map的底层是一个红黑树实现,对于更新和遍历都是比较方便的。(数组和最大堆都不方便更新最后消息时间):

我们需要做的是加入时间函数,并且在创建连接的时候增添键值对,同时在处理消息事件的时候同步更新时间,然后在每次循环过程中,处理超过一段时间没消息的连接:

免费教学更多>>

vivo Y300手机主要参数曝光:天玑6300处理器,明日发布 英特尔酷睿200系列移动处理器阵容曝光:计划CES 2025上发布22款产品 CPU处理器芯片性能指标详解 哪款显卡性价比更高,RTX 5070 Ti还是RTX 4070 Ti? 一招白嫖30%+性能,内存条潜力终于被榨干了 在活动现场 ,爱攻27英寸电竞显示器助力玩家畅玩时下热门3A大作以及FPS游戏… 准系统2499元 玩家战魂推出8845HS迷你主机:稳定65W运行 零刻EQ14迷你主机体验:首发英特尔N150 6年研发投入超3200亿 腾讯以“AI+”创新赋能千行百业 12月16日海尔智家AH溢价达11.13%,位居AH股溢价率第148位 青岛经济技术开发区海尔热水器有限公司取得显示系统及热力装置专利,有利于利用换热系统对显示装置进行降温 美的取得装饰面板及冰箱专利,可提高冰箱美观度 长虹智慧供应链①:一场采购的变革 看长虹如何重塑供应链 丽水莲都:古村落“村晚”带货出山 摒弃畸形流量观,网络直播才能告别“野蛮生长” 唐山港!唐山高新区机器人! 云南水利水电职业学院召开建校70周年高质量发展系列活动筹备工作会议 虚拟数字人在娱乐领域的应用有哪些? “数字人”成热门赛道,预计到2026年市场规模将超百亿元 全球招聘具身智能人才,比亚迪也要造人形机器人了 喜报!京雄高速智能驾驶测试场景成功入选京津冀共建共享十大标杆案例 肥东首批无人驾驶车“上岗” 人工智能咋发展?这份行动方案想听听您意见 2024年全球加快推进人工智能监管 北京AI产业核心产值将破三千亿元 年末跨境电商持续火热 业界看好红利延续 淘宝公布2024年度十大商品入围榜单 新增挂牌量连续两个月负数,杭州二手房库存正在减少 中建鹏宸云筑:深圳新房“日光”频现关键字:深圳新房 日光盘 中建鹏宸云筑 环比连涨30个月,“量减价增”的上海新房市场显现极强韧性