易语言资源网 - 做最全的易语言资源下载社区
精易论坛授权登录
退出登录
我要分享内容
全部
易语言源码
易语言模块
易语言支持库
易相关资源
易相关资料
开源大赛
火山相关资源
其他资源
搜索
精易模块
自绘
界面美化
汇编
POST
API
易语言助手
高级搜索
首页
易语言源码
入门教程源码
初级教程源码
进阶教程源码
高级教程源码
系统工具源码
图形图像源码
多媒体类源码
游戏娱乐源码
数据库类源码
模块控件源码
行业软件源码
网络相关源码
界面美化源码
易语言模块
易语言支持库
易官方支持库
第三方支持库
OCX控件库
辅助类支持库
支持2017link的改造库
易相关资源
易语言版本下载
易语言配色方案
编程辅助工具
编译链接器
易相关资料
电子书类
图文资料
开源大赛
2016开源大赛(第一届)
2017开源大赛(第二届)
2018开源大赛(第三届)
2019开源大赛(第四届)
2020开源大赛(第五届)
2021开源大赛(第六届)
2022开源大赛(第七届)
火山相关资源
火山版本下载
火山安卓源码
火山PC源码
其他资源
JavaScript
PHP
C++
HTML
uni-app
Java
Golang
C#
Delphi
全部
易语言源码
易语言模块
易语言支持库
易相关资源
易相关资料
开源大赛
火山相关资源
其他资源
当前位置:
易语言资源网
>
模块控件源码
>
帖子内容
【全网首发】利用APC异步模型实现底层socket高效并发
[复制链接]
2022-09-01 08:35:34
模块控件源码
易语言资源网
1804
次浏览
来源链接
前言:
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),该事件将会一直被查询到,直到事件被响应。
点我下载
(已有
95
次下载)
引用模块
源码文件名
模块文件名
service+client.e
AFD模块.ec
test.e
简易服务器/客户端.ec
引用支持库
源码文件名
支持库文件名
支持库标识
msafd.e
系统核心支持库 5.7
d09f2340818511d396f6aaf844c7e325
service+client.e
系统核心支持库 5.7
d09f2340818511d396f6aaf844c7e325
test.e
系统核心支持库 5.7
d09f2340818511d396f6aaf844c7e325
[错误报告]
上一篇:易语言实现三级联动菜单到树型框...
下一篇:蓝奏云网盘 - PC客户Duan v4....
本栏最新
1
【已更新】快速字节集类 快速文本类,替代通用对象库
2
PS对象操作类模块 更新 用于操作Photoshop 制作自动化脚本
3
宝塔模块开源
4
rdtsc取纳秒级时间计数
5
文本笔算_加减乘除_支持正负[小数/整数/大数/前缀0的数]
6
高性能读写锁_同步锁v2.6.1 几乎纯汇编 支持跨进程
7
汇编 最快倒找+寻找文本+字节集2.3.1
8
文本加密
9
易语言字体安装,永久生效,立即生效
10
everything调用模块
本栏最热
1
分享一个 可精确控制 网页_访问_对象 超时时间 源码
2
大漠插件中文汉化模块源码
3
易语言超级模块8.0正式版源码
4
新版33个皮肤模块源码分享
5
大漠插件免费版3.1233的中文版模块
6
精易皮肤模块v4.0(2020.01.03)开源
7
IMGUI绘制模块源码
8
鱼刺类_Http模块v6.0.6源码
9
eWOW64Ext v1.2 - 加载任意 32/64 模块|动态调用|64 位汇编|64 位进程读写
10
ImGui 1.77最新最全库函数封装,UI库的又一新选择
栏目标签
HpSocket
checkbos
数组
API
SQL
算法
自绘
精易模块
皮肤模块
截图
多线程
黑月
托盘
SUI
特效