最近有项目要做一个高功能网络服务器,决定下功夫搞定完成端口(IOCP),最终花了一个星期终于把它弄清楚了,并用C++写了一个版本,效率很不错。
但,从项目的总体需求来考虑,最终决定上.net平台,因此又花了一天一夜弄出了一个C#版,在这与大家分享。
一些心得体会:1、在C#中,不用去面对完成端口的操作系统内核对象,Microsoft已经为我们提供了SocketAsyncEventArgs类,它封装了IOCP的使用。
请参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socketasynceventargs.aspx?cs-save-lang=1&cs-lang=cpp#code-snippet-1。
2、我的SocketAsyncEventArgsPool类使用List对象来存储对客户端来通信的SocketAsyncEventArgs对象,它相当于直接使用内核对象时的IoContext。
我这样设计比用堆栈来实现的好处理是,我可以在SocketAsyncEventArgsPool池中找到任何一个与服务器连接的客户,主动向它发信息。
而用堆栈来实现的话,要主动给客户发信息,则还要设计一个结构来存储已连接上服务器的客户。
3、对每一个客户端不管还发送还是接收,我使用同一个SocketAsyncEventArgs对象,对每一个客户端来说,通信是同步进行的,也就是说服务器高度保证同一个客户连接上要么在投递发送请求,并等待;
或者是在投递接收请求,等待中。
本例只做echo服务器,还未考虑由服务器主动向客户发送信息。
4、SocketAsyncEventArgs的UserToken被直接设定为被接受的客户端Socket。
5、没有使用BufferManager类,因为我在初始化时给每一个SocketAsyncEventArgsPool中的对象分配一个缓冲区,发送时使用Arrary.Copy来进行字符拷贝,不去改变缓冲区的位置,只改变使用的长度,因此在下次投递接收请求时恢复缓冲区长度就可以了!如果要主动给客户发信息的话,可以new一个SocketAsyncEventArgs对象,或者在初始化中建立几个来专门用于主动发送信息,因为这种需求一般是进行信息群发,建立一个对象可以用于很多次信息发送,总体来看,这种花销不大,还减去了字符拷贝和消耗。
6、测试结果:(在我的笔记本上时行的,我的本本是T420I78G内存)100客户100,000(十万次)不间断的发送接收数据(发送和接收之间没有Sleep,就一个一循环,不断的发送与接收)耗时3004.6325秒完成总共10,000,000一千万次访问平均每分完成199,691.6次发送与接收平均每秒完成3,328.2次发送与接收整个运行过程中,内存消耗在开始两三分种后就保持稳定不再增涨。
看了一下对每个客户端的延迟最多不超过2秒。
2020/5/13 2:27:34 15KB IOCP 完成端口 源码
1
2W+的淘宝类目,虽然不多,但是是我找到的暂时最多的了,进展对大家有用
2017/11/27 14:58:06 858KB 淘宝类目
1
jaffe人脸数据库,是在人脸表情识别研究中使用最多的数据库之一。
包括216张人脸表情图像数据,每人20几张幅分辨率为256×256的图像组成
2019/9/1 22:35:50 9.9MB 人脸数据库
1
本模具作为珍藏备份用,若你也喜欢,下载便是VISIO的多树枝直角很好用,但最多支持6条分支线,通常不够用。
该模具中扩展到了20条分支,基本够用,你只要将其导入你的wisio就行了
2019/6/6 20:52:17 52KB VISIO 多树枝 直角 20条
1
(1)系统资源分配图输入(界面)• 按资源分配图的方式定义,输入进程名字、资源类名字及其个数、申请/占有边。
(2)运行结果(界面)• ①以图形的方式输出原资源分配图;
• ②以图形的方式动态输出原资源分配图约简过程• 实现(1)图的描述:定义资源类结点和进程结点的数据结构,以指针方式表示结点之间边的关系(可限定最多指针个数);
(2)按算法对描述的资源分配图进行约简,同时用动态图形显示约简过程;
(3)约简结束后,给出资源分配图是否可完全约简的提示信息。
2017/3/19 3:34:41 2.45MB 死锁 判定
1
CSDN限制最多上传70M的单文件,所以压了三个包,不用痛苦去下6个包了
2020/10/3 1:42:57 67.82MB WinCE PB60 2008年 全年补丁包
1
在前面的日志中,讲述了如何使用Subversion提供的svnserve服务,通过svn://协议访问远端的仓库数据。
实际上,Subversion的设计包括了一个抽象的网络层,这意味着版本库是可以通过各种服务器进程访问的。
理论上来会说,Subversion可以使用无限数量的网络协议来实现,甚至可以直接用perl利用相关的接口来编写自定义协议。
但日常中,用得最多的就是svn://协议,和用mod_dav_svn模块通过Apache服务进行访问。
通过HTTP协议访问版本库是Subversion的亮点之一,这种方式具备许多svnserve服务器所没有的特性,使用上愈加灵活。
一、关于mod_dav_s
2016/8/27 20:32:12 180KB 使用mod_dav_svn访问Subversion仓库
1
1、用键盘输入绝对应的数字。
2、进行加减时,用0/1控制,当为1时,在16*16的显示板上显示加号或减号或等于号。
3、在显示加减号时,把数码管清空,以便输入第二个数。
4、在显示等号时,显示出相应的结果。
5、最多只可进行5位数字的加减运算,当输入数字式,输入到
2017/9/7 9:17:30 139KB 计算器
1
上期CTPAPIC++源代码多合约多策略版下载文件名上期:CTP_API_C++可实盘多合约多策略版本源代码.rar是"上期CTP_API_C++可实盘的源代码(更新).rar"的升级版填入经纪公司代码,实盘帐号,密码即可。
可完成行情接收,指标策略计算,实盘下单连续开平仓。
功能简要介绍如下:自动保存订阅合约TICK数据到\Bin\TickData下,文件名:合约名称_日期.txt自动保存下单数据到\Bin\AutoTrade下,文件名:日期.txtMD线程只负责处理最多20个合约TICK行情接收和缓存,根据TICK数据生成1分钟K线TRADE线程负责最多20个合约下单及响应,可连续开平仓。
提示一下:我只测了单合约,多合约没正式下过单买卖。
附简单独立的2个指标策略计算以及下单控制部分,提示一下:这个还是需要自己根据需要去完善的。
增加读写行情配置文件部分,开盘前读,收盘保存重要数据。
增加读写买卖配置文件部分,盘中完全退出重新登录,会自动获取上一笔买卖数据。
附上期CTP仿真帐号以及密码,盘后也可进行测试。
上期ctp库版本为2013-12-05编译版本VS2008
2016/9/27 20:12:09 13.16MB CTP 多合约 多策略 实盘
1
最近实在装了太多宜家的家具,经过几次自作聪明装错返工之后,我逐步发现了宜家说明书里的几个细节,有了点启发。
面对一个个平板包装,我首先想到一个宜家家具的设计师至少要做到下面三点。
设计一个具有设计感和功能性平衡的家具。
(绝大多数设计师只需要做到这一点就行了)把这个东西(不管多大)拍扁到最多三个最长两米宽不到一米的平板包装里。
设计一个没有任何文字的说明书,让全世界不同背景的人都可以用最简单的工具组装起来。
如果说前两条是可以设计师自己以各种匪夷所思的奇思妙想实现的话,第三条则必须要考虑到各种各样奇奇怪怪的用户,大多数人还是第一次自己组装家具。
需要打破语言教育认知等种种藩篱,这么复杂的教育工作就靠几页没
1
共 307 条记录 首页 上一页 下一页 尾页
在日常工作中,钉钉打卡成了我生活中不可或缺的一部分。然而,有时候这个看似简单的任务却给我带来了不少烦恼。 每天早晚,我总是得牢记打开钉钉应用,点击"工作台",再找到"考勤打卡"进行签到。有时候因为工作忙碌,会忘记打卡,导致考勤异常,影响当月的工作评价。而且,由于我使用的是苹果手机,有时候系统更新后,钉钉的某些功能会出现异常,使得打卡变得更加麻烦。 另外,我的家人使用的是安卓手机,他们也经常抱怨钉钉打卡的繁琐。尤其是对于那些不太熟悉手机操作的长辈来说,每次打卡都是一次挑战。他们总是担心自己会操作失误,导致打卡失败。 为了解决这些烦恼,我开始思考是否可以通过编写一个全自动化脚本来实现钉钉打卡。经过一段时间的摸索和学习,我终于成功编写出了一个适用于苹果和安卓系统的钉钉打卡脚本。
2024-04-09 15:03 15KB 钉钉 钉钉打卡