开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 16464|回复: 171
收起左侧

[易源码分享] 【全网首发】利用APC异步模型实现底层socket高效并发

    [复制链接]
发表于 2022-8-28 19:26:31 | 显示全部楼层 |阅读模式   北京市北京市
分享源码
界面截图:
是否带模块: 纯源码
备注说明: -

前言:

  • socket有着不同的模型,不同的模型有不同的并发性能。
  • 常用的模型一般有线程池模型,Select模型,Asynchronous异步模型,IOCP等等(WSAAsyncSelect内部即使用IOCP),不同的模型有不同的优势。
  • 本程序使用的模型利用Asyncroneus Procedure Call完整实现。本质上仍然是Asynchronous异步模型,但是和原来的Asynchronous异步模型不同的是,本程序直接实现了WSPSelect的IOCTL_AFD_SELECT异步过程,和其他的异步过程的实现函数完全不同(注意:WSASelect并未开放异步接口,程序参考ReactOS实现)
  • 叫“全网首发”可能也有点问题,不知道之前有没有大佬逆向过winsock实现过相似的异步过程。(不过我反正翻不到,翻到了可以提醒我)

正文:

  • 原系统的WSASelect并未开放异步接口,但是实际上,WSASelect调用NtDeviceIoControlFile实现,NtDeviceIoControlFile函数本身可以实现APCRoutine,于是便有了这个程序。
  • 在代码中,WSPSockProcessAsyncSelect(我乱取的名字,别太在意)实现了Select过程的异步化。本命令被调用后将会直接返回,不会阻塞程序,当select过程产生真实的数据反馈时,内核将会异步调用ApcRoutine:
  • 所以只要稍加封装便可得到这个异步模型,这个异步模型可以实现socket消息的异步通知(包括客户连接,send消息,recv消息等等)
  • 提示:IOCP模型实际工作原理与此类似,不过IOCP模型是使用完成端口实现的异步调用。
  • 程序效率对比(仅仅比较多客户accept和断开的速度,测试结果已经去除包括输出、数据显示在内的可能干扰程序速度的因素):
    • BBTCP纯连接效率(IOCP实现):
    • MSAFD纯连接效率(即本程序):
    • 可以看到效率十分接近,证明本模型在1000用户量依次连接时异步效率不错。(在测试1000连接时,BBTCP出现了大约1%的连接没有连上,本程序在此测试中未出现此情况。在测试10000连接时,本程序也出现了约1%的连接没有连上的情况,这也说明本单线程模型可能不是很适合超大量用户并发)

已知问题:

  • AsyncSelect不会记录事件是否已经发生过!即如果一个客户向本模型请求了Client,模型如果没有accept的话,异步接口将会被一直触发(AFD_EVENT_ACCEPT事件)!直到accpet为止!
  • 同理,如果程序向服务端send了数据,服务端没有recv,异步接口将会被一直触发(AFD_EVENT_RECEIVE事件)。
  • 这个问题其实和select本身有关,select其实就是查询是否存在某事件,如果事件没有响应的动作(例如还有数据没有recv),该事件将会一直被查询到,直到事件被响应。

源码下载:


msafd.zip (63.98 KB, 下载次数: 367)

评分

参与人数 14好评 +12 精币 +37 收起 理由
ikumu + 1 + 2 支持开源~!感谢分享
794229345 + 1 + 2 开源精神必须支持~
kyo9766 + 2 感谢分享,很给力!~
llxx123 + 1 + 2 支持开源~!感谢分享
易语言资源网 + 1 + 5 开源精神必须支持~
司徒西 + 1 + 2 支持开源~!感谢分享
冬夏 + 1 可能我的测试跟楼主的测试有所差异,我使用多并发测试BBTCP并未出现连接不上的情况.
小明无敌 + 1 + 5 支持开源~!感谢分享
无间eyy + 1 + 2 感谢分享,很给力!~
冰点 + 1 + 5 感谢分享,很给力!~
fjgh + 1 + 2 支持开源~!感谢分享
猪滴寳貝哝 + 1 + 2 开源精神必须支持~
z博士 + 1 + 2 YYDS~!
空之影 + 1 + 3 支持开源~!感谢分享

查看全部评分


本帖被以下淘专辑推荐:

结帖率:0% (0/2)
发表于 2024-7-26 22:39:23 | 显示全部楼层   四川省成都市
开源精神必须支持~
回复 支持 反对

使用道具 举报

结帖率:0% (0/1)
发表于 2024-1-8 17:12:26 | 显示全部楼层   湖北省襄阳市
谢谢分享,楼主辛苦。
回复 支持 反对

使用道具 举报

结帖率:17% (1/6)

签到天数: 4 天

发表于 2023-11-13 04:59:54 | 显示全部楼层   浙江省台州市
感谢分享,很给力!~感谢分享,很给力!~感谢分享,很给力!~感谢分享,很给力!~感谢分享,很给力!~
回复 支持 反对

使用道具 举报

结帖率:17% (1/6)

签到天数: 4 天

发表于 2023-11-13 04:59:07 | 显示全部楼层   浙江省台州市
777777777777777777777777777777
回复 支持 反对

使用道具 举报

结帖率:17% (1/6)

签到天数: 4 天

发表于 2023-11-13 04:35:55 | 显示全部楼层   浙江省台州市
6666666666666666666
回复 支持 反对

使用道具 举报

发表于 2023-10-6 20:15:18 | 显示全部楼层   辽宁省辽阳市
感谢开源
回复 支持 反对

使用道具 举报

结帖率:96% (149/156)

签到天数: 1 天

发表于 2023-7-2 11:48:12 | 显示全部楼层   山东省泰安市
ANormalUser 发表于 2022-8-30 07:03
@冬夏 上面的测试模拟的是大量Client存活极短的时间情况下的极端连接情况,不是稳定连接存活情况。所以有区 ...

你好,请问设置客户类 连接超时 发送超时该怎么写呢,有偿求改写
回复 支持 反对

使用道具 举报

结帖率:38% (8/21)

签到天数: 13 天

发表于 2023-6-8 20:33:32 | 显示全部楼层   四川省广元市
大佬 好像取IP地址有点问题 如果是wai网IP取不完整
回复 支持 反对

使用道具 举报

结帖率:71% (12/17)

签到天数: 8 天

发表于 2023-4-29 00:31:50 | 显示全部楼层   河南省信阳市
这个太厉害了 学习一下。。。。。。。。。。。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表