最近有项目要做一个高功能网络服务器,决定下功夫搞定完成端口(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
服务器端利用I/O复用同时支持TCP和UDP,在同一个端口上同时绑定TCP套接口和UDP套接口,使用select()函数等待读写就绪条件的发生,然后经过FD_ISSET(listenfd,&rset)和FD_ISSET(listenfd,&rset)判断是TCP就绪还是UDP就绪。
使用fork()函数利用子进程处理并行客户,从而达到多个客户进行聊天。
当客户端从标准输入中输入信息,发送到服务器端,服务器接收信息并记录,又立即发送给除发送端之外的所有已连接客户,其他客户就可以看到聊天信息了,最终实现多个客户进行聊天的聊天室。
2018/9/22 3:30:32 788KB 课程设计
1
Docker撰写JUnit规则这是一个用于执行与DockerCompose托管容器进行交互的JUnit测试的库。
它支持以下内容:在测试之前启动在docker-compose.yml中定义的容器,然后将其拆除在运行测试之前等待服务可用记录容器中的日志文件以协助调试测试失败我为什么要用这个?此处的代码从对我们其中一种产品的端到端测试开始。
我们需要在互不兼容的各种不同配置和环境中测试该产品,因此需要多个DockerCompose文件,因此在Gradle中运行docker-composeup的简单模型不足。
如果您在使用Docker进行测试时遇到以下任何情况,则该库有望为您提供协助:编排多个服务并将端口映射到Docker计算机外部,以便可以在测试中进行断言需要知道服务何时启动,以防止由于启动速度慢或服务依赖关系复杂而导致的闪烁测试由于日志丢失,对在CI服务器上进行测试期间Docker容器中发生的事情缺乏了解由于在CI构建主机上需要打开端口而导致测试失败,该端口与测试配置冲突使用简单将依赖项添加到您的项目。
例如,在gradle中:repositor
2016/7/27 17:54:22 331KB docker docker-compose junit junit-rule
1
procreate大师画板中文操作手册,其中的一些不为人知的技巧可是等待大家的发掘,但是哪有官方给出的片面和真实呢?
2017/11/1 15:02:08 13.83MB procreate 中文
1
添加一个任务LED灯定时闪烁的任务:景象:在连接上蓝牙后,大概等待5~6秒后,LED开始闪烁
2019/3/7 21:16:22 54.47MB DA14584 rw
1
PCtoLCD2002使用教程在正式版中,用户可生成自己需要的各种小字库,也可以生成自定义的国标一二级汉字库。
0.生成自定义的小字库:0.使用PCTOLCD的各种调整功能调整出您需要的文字样式,如字体,字样(下划,倾斜,加粗),大小(各种点阵大小的字体,可锁定点阵本身大小(如16*16),然后在这个固定的点阵大小内调节文字的大小(例如在16*16的点阵中居中显示12*12大小的汉字)1.将您需要的汉字和符号集中构成一个文本文件2.使用“导入文本”的按钮3.确认“生成二进制字库”被选中(建议选中"生成索引文件"原因后析)4.点“开始生成”按钮,选择生成的字库文件名5.然后耐心等待一段时间(与处理文本大小有关),在此期间建议不要动键盘和鼠标。
6.字库生成完毕.1.生成国标一二级汉字库0.使用PCTOLCD的各种调整功能调整出您需要的文字样式,如字体,字样(下划,倾斜,加粗),大小(各种点阵大小的字体,可锁定点阵本身大小(如16*16),然后在这个固定的点阵大小内调节文字的大小(例如在16*16的点阵中居中显示12*12大小的汉字).1.使用“导入文本”的按钮2.点右下角"生成国标汉字库"按钮.3.选择字库文件名后单击确定4.耐心等待一段时间后既得到生成的汉字库(时间视具体机器而定).生成汉字库结构介绍本软件使用的汉字库采用与HZK16相近似的结构,即按照输入汉字的顺序依次排列各汉字的点阵数据,以生成的16*16点阵汉字库举例介绍16*16点阵汉字库点阵大小16*16,所以每个汉字点阵数据占用32个字节.用户要使用生成的16*16点阵小字库中的点阵数据,可以在程序中采用如下算法:0.在生成的字库汉字列表中得到该汉字的偏移量,也就是汉字的记录号HzNum1.将其*32(HzNum*32)即可得出该汉字点阵在字库中的偏移地址.3.以这个偏移地址为起点,连续读取文件中的32个字节,既为该汉字的点阵信息.实际上,对于本软件生成的16*16点阵的国标汉字库是采用区位码排列的,所以与标准的HZK16结构是一样的,完全可以互换使用.例如生成一个24*48点阵,楷体,倾斜的汉字库,0.由于每个汉字占用24*48/8=144个字节,所以用户可先读取生成的索引列表找到该汉字的记录号.1.将记录号*144即得到该汉字在字库中的偏移地址.2.以这个偏移地址为起点,在字库文件中连续读取144个字节,即为该汉字的点阵信息.对于其他点阵汉字库的使用方法,可以依次类推……当然,如果不选中“生成二进制字库”的复选框,生成的字库将是文本格式的字模数据,采用那种方式完全取决于您的需要了完美版新增生成英文点阵字库功能,使用方法同上。
2017/8/17 7:32:02 1.09MB lcd
1
利用循环队列来实现银行排队零碎,对进入队列的客户分为VIP和普通客户,其中VIP优先出队。
能实现的功能如下1.新客户排队等待服务2.客户离开排队服务3.查询当前客户前面还有几人4.查询截止目前总共办理多少客户注:每个功能都能显示当前排队情况
2021/2/27 13:51:13 257KB 循环队列 银行排队系统
1
本次实验要求实现M/M/1单窗口无限排队零碎的零碎仿真,利用事件调度法实现离散事件零碎仿真,并统计平均队列长度以及平均等待时间等值,以与理论分析结果进行对比。
2018/8/15 3:24:45 945KB 排队
1
设计一个拥有注册、登录、退出功能的小程序。
一、接口提供方(1)使用面向对象思想,将方法封装到某个类中。
(2)创建一个独立的包、模块存放这个类。
(3)提供注册功能:需要输入“手机号码”、“密码”、“确认密码”三个信息。
注册完成后提示注册的手机号码。
限制手机号码长度11位,不满足则抛出异常给调用方;
密码、确认密码长度为6位,不符合则抛出异常给调用方;
密码、确认密码不相同,也抛出异常给调用方。
(4)注册信息保存到本地一个文件中。
(5)提供登录功能:登录成功后,提示欢迎登录;
账号不存在时、账号或者密码不正确时,抛出异常。
(6)提供退出功能:需要输入用户名,打印xxx退出登录。
(7)自定义多个异常类并继承Exception。
以满足上面的不同情况。
二、接口调用方:调用方是程序入口,它是独立的python文件。
主要功能为:(1)显示欢迎提示:程序运行起来,打印欢迎信息,并打印功能菜单,并提示用户进行的输入选择。
输入1执行注册、输入2执行登录、输入3执行退出登录、其他无效输入。
(2)主程序不断在循环运行,等待用户输入。
2016/3/21 13:28:22 7KB python 注册 登录 退出登录
1
可以一键实现从X-code打包至ipa的过程,无需不断等待。
而且实测速度似乎是要比手动打包快一些。
同时也支持一键上传appsotre。
2019/10/24 5:16:19 2KB Unity打包ipa
1
共 401 条记录 首页 上一页 下一页 尾页
在日常工作中,钉钉打卡成了我生活中不可或缺的一部分。然而,有时候这个看似简单的任务却给我带来了不少烦恼。 每天早晚,我总是得牢记打开钉钉应用,点击"工作台",再找到"考勤打卡"进行签到。有时候因为工作忙碌,会忘记打卡,导致考勤异常,影响当月的工作评价。而且,由于我使用的是苹果手机,有时候系统更新后,钉钉的某些功能会出现异常,使得打卡变得更加麻烦。 另外,我的家人使用的是安卓手机,他们也经常抱怨钉钉打卡的繁琐。尤其是对于那些不太熟悉手机操作的长辈来说,每次打卡都是一次挑战。他们总是担心自己会操作失误,导致打卡失败。 为了解决这些烦恼,我开始思考是否可以通过编写一个全自动化脚本来实现钉钉打卡。经过一段时间的摸索和学习,我终于成功编写出了一个适用于苹果和安卓系统的钉钉打卡脚本。
2024-04-09 15:03 15KB 钉钉 钉钉打卡