首页 > 生活感悟 > 免费教学 > 写一个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的底层是一个红黑树实现,对于更新和遍历都是比较方便的。(数组和最大堆都不方便更新最后消息时间):

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

免费教学更多>>

消息称某厂骁龙8s至尊版新机明年4月前后上市,预计小米旗下 紫光展锐力推5G融云 云终端开启新时代 5G发展进入“下半场” 将深化与AI、北斗等融合创新!5GETF(159994)投资价值值得关注 iOS18.2正式版不同iPhone机型的测试结果! 没有wifi网络,安卓手机与windows电脑如何互传文件? 华为鸿蒙 OS NEXT(5.0):开启中国科技新纪元 腾讯企业微信纯血鸿蒙版App上架HarmonyOS NEXT应用市场 难能可贵的平价笔记本,荣耀X16锐龙版 商务电脑玩法升级,可延长到5年质保,看看三款i3-14100谁更强 MKBHD年度评选:iPhone 16获最佳小型手机,年度最佳机型被三星拿下 三星Galaxy S25系列手机明年2月7日上市,包含全新Slim版 GG100 2024:惠普战66七代AI轻薄本质感大升级 获奖 共计9款,华硕英特尔B860与AMD B850、B840主板渲染曝光 联想百应智能体打造中小企业步入AI第一入口,助推新质生产力加速释放 探访联想武汉产业基地:智能化、绿色化活力涌动 “DMH”有多美好 听听荣威车主怎么说 第33艘汽车船入列!中国汽车出海 上汽集团造船 上汽旗下安吉物流第33艘汽车船入列,计划投入美墨航线 一汽奔腾B70龙耀版黑骑士燃油轿车官图公布,12月24日上市 近一年卖出8万多台!零跑C11增程版,是真香还是跟风? 零跑C11增程与深蓝S07对比,谁的性价比更高? 解读零跑C10纯电版:大五座中型SUV,231匹马力+纯电续航530km 年末购车指南:极狐阿尔法S5与小鹏MONA M03谁更讨你的喜欢? 小鹏汽车2025年产品规划:改款G6和MONA系列很关键 理想最便宜的奶爸车来了 实测理想L6 争议中的ET9和萤火虫:蔚来如何开启新十年? 十年技术集大成者,蔚来ET9能成为“这个时代最好的车”吗? 广汽埃安新纯电小车亮相,6种外观配色可选,尺寸超比亚迪海豚 广汽第三代具身智能人形机器人官宣,行业首创两轮四轮切换移动 佩戴舒适,更轻更好听的开放式耳机推荐:南卡Clip Pro真无线耳机