C#高性能大容量SOCKET并发(一):IOCP完成端口例子介绍(转)
原文地址 http://blog.csdn.net/SQLDebug_Fan/article/details/17556353
例子主要包括SocketAsyncEventArgs通讯封装、服务端实现日志查看、SCOKET列表、上传、下载、远程文件流、吞吐量协议,用于测试SocketAsyncEventArgs的性能和压力,最大连接数支持65535个长连接,最高命令交互速度达到250MB/S(使用的是127.0.0.1的方式,相当于千兆网卡1Gb=125MB/S两倍的吞吐量)。服务端用C#编写,并使用log4net作为日志模块;客户端使用DELPHI编写,和以前的DELPHI版完成端口共用一个客户端,提供C#版的上传客户端。
C#版完成端口具有以下特点:
- 连接在线管理(提供在线连接维护,连接会话管理,数据接收,连接断开等相关事件跟踪);
- 发送数据智能合并(组件会根据资源使用情况,对多个同时发送向同一连接的多个消息数据进行合并写入缓冲区;
- 内存池管理(提供一系列的接收和发送buffer可复用池);
- 数据读写封装;
- 通讯协议封装;
由不同的类负责实现,比MSDN的例子代码多了不少逻辑,为了方便大家阅读和理解,把整体类框架设计整体如下。
类结构图
服务端
服务端是一个控制台程序,支持分颜色显示日志,界面截图如下:
客户端
用于对服务端进行性能测试,实现了吞吐量测试协议,还有日志、查看客户端、上传、下载、远程文件流五个应用层协议,可以作为要实现其他协议的例子参考,其中远程文件流可以作为分布式系统的底层数据交互模块,界面截图如下:
暂不提供NET的客户端,NET的界面编程还在学习中,非常抱歉。
性能测试结果
支持65535个长连接,为了支持65535个连接,需要把程序用64位进行编译。
循环发包网络流量可以达到250MB/S,受限于是网卡流量,千兆网卡最大1Gb=125MB/S,为了测试最大吞吐量,我们需要把客户端和服务器放在同一台电脑上,使用127.0.0.1这个IP测试,127.0.0.1是本机回送地址(Loopback Address),即主机IP堆栈内部的IP地址,主要用于网络软件测试以及本地机进程间通信,无论什么程序,一旦使用回送地址发送数据,协议软件立即返回,不进行任何网络传输。
其中截图如下:
按文件上传下载对服务器进行应用层速率测试,分为1、16、64、256个并发进行测试,发包大小分1、2、4、8、16、32、64、128、256、512、1024KB,测试结果汇总如下,其中最高速率达到250MB/S,综合最优发包大小为16、32KB,其中速率计算有可能存在偏差,因为传到最后,并发数会变小,造成整个的速率上升,可以作为性能测试的参考。
DEMO下载地址:http://download.csdn.net/detail/sqldebug_fan/7467745
C#高性能大容量SOCKET并发(一):IOCP完成端口例子介绍(转)的更多相关文章
- C#高性能大容量SOCKET并发(转)
C#高性能大容量SOCKET并发(零):代码结构说明 C#高性能大容量SOCKET并发(一):IOCP完成端口例子介绍 C#高性能大容量SOCKET并发(二):SocketAsyncEventArgs ...
- C#高性能大容量SOCKET并发(十一):编写上传客户端
原文:C#高性能大容量SOCKET并发(十一):编写上传客户端 客户端封装整体框架 客户端编程基于阻塞同步模式,只有数据正常发送或接收才返回,如果发生错误则抛出异常,基于TcpClient进行封装,主 ...
- C#高性能大容量SOCKET并发(四):缓存设计
原文:C#高性能大容量SOCKET并发(四):缓存设计 在编写服务端大并发的应用程序,需要非常注意缓存设计,缓存的设计是一个折衷的结果,需要通过并发测试反复验证.有很多服务程序是在启动时申请足够的内存 ...
- C#高性能大容量SOCKET并发(零):代码结构说明
原文:C#高性能大容量SOCKET并发(零):代码结构说明 C#版完成端口具有以下特点: 连接在线管理(提供在线连接维护,连接会话管理,数据接收,连接断开等相关事件跟踪): 发送数据智能合并(组件会根 ...
- C#高性能大容量SOCKET并发(十):SocketAsyncEventArgs线程模型
原文:C#高性能大容量SOCKET并发(十):SocketAsyncEventArgs线程模型 线程模型 SocketAsyncEventArgs编程模式不支持设置同时工作线程个数,使用的NET的IO ...
- C#高性能大容量SOCKET并发(九):断点续传
原文:C#高性能大容量SOCKET并发(九):断点续传 上传断点续传 断点续传主要是用在上传或下载文件,一般做法是开始上传的时候,服务器返回上次已经上传的大小,如果上传完成,则返回-1:下载开始的时候 ...
- C#高性能大容量SOCKET并发(七):协议字符集
原文:C#高性能大容量SOCKET并发(七):协议字符集 UTF-8 UTF-8是UNICODE的一种变长字符编码又称万国码,由Ken Thompson于1992年创建.现在已经标准化为RFC 362 ...
- C#高性能大容量SOCKET并发(六):超时Socket断开(守护线程)和心跳包
原文:C#高性能大容量SOCKET并发(六):超时Socket断开(守护线程)和心跳包 守护线程 在服务端版Socket编程需要处理长时间没有发送数据的Socket,需要在超时多长时间后断开连接,我们 ...
- C#高性能大容量SOCKET并发(五):粘包、分包、解包
原文:C#高性能大容量SOCKET并发(五):粘包.分包.解包 粘包 使用TCP长连接就会引入粘包的问题,粘包是指发送方发送的若干包数据到接收方接收时粘成一包,从接收缓冲区看,后一包数据的头紧接着前一 ...
- C#高性能大容量SOCKET并发(三):接收、发送
原文:C#高性能大容量SOCKET并发(三):接收.发送 异步数据接收有可能收到的数据不是一个完整包,或者接收到的数据超过一个包的大小,因此我们需要把接收的数据进行缓存.异步发送我们也需要把每个发送的 ...
随机推荐
- c排序算法大全
排序算法是一种基本并且常用的算法.由于实际工作中处理的数量巨大,所以排序算法 对算法本身的速度要求很高. 而一般我们所谓的算法的性能主要是指算法的复杂度,一般用O方法来表示.在后面将给出详细的说明.& ...
- android定时三种方式
一.采用Handler与线程的sleep(long)方法二.采用Handler的postDelayed(Runnable, long)方法三.采用Handler与timer及TimerTask结合的方 ...
- WebAPI 时代
引言 小编跳槽到现任公司有一段时间,在这个公司对于小编是各种挑衅啊,也颠覆了小编之前的编程生涯,在前面 的博客中小编隆重介绍了angularJS这个大神,这个让我不堪回首的两周,真是黑色天使啊!从现在 ...
- web开发利器 fiddler
http://mccxj.github.io/blog/20130531_introduce-to-fiddler.html
- Effective java笔记4--方法
一.检查参数的有效性 极大多数方法和构造函数都会对于传递给它们的参数值有某些限制. 对于公有的方法,使用Javadoc @throws标签(tag)可以使文档中记录下“一旦针对参数值的限制被违反之后将 ...
- PHP开发规范
十.开发规范下面我们讲解 Yii 编程中推荐的开发规范.为简单起见,我们假设 WebRoot 是 Yii 应用安装的目录.1.URL默认情况下,Yii 识别如下格式的 URL: http://host ...
- 自定义控件如何给特殊类型的属性添加默认值 z
定义控件如何给特殊类型的属性添加默认值了,附自定义GroupBox一枚 标题有点那啥,但确实能表达我掌握此法后的心情. 写自定义控件时往往会有一个需求,就是给属性指定一个默认值(就是可以在VS中右键该 ...
- 【剑指offer 面试题38】数字在排序数组中出现的次数
思路: 利用二分查找,分别查找待统计数字的头和尾的下标,最后做差加一即为结果. C++: #include <iostream> #include <vector> using ...
- Php 笔记1-----request和 response
不能大于2KB 第一次学习 php, 因为以前习惯了 .net, 所以 刚开始总是按照.net的 思路去思考, 怎么获取 客户端发过来的 request对象啊, 怎么设置response啊.. ...
- XML序列化成对象
这个是和ALM上传测试结果结合使用的//把xml序列化成对象以及把对象序列化成xml using System; using System.Data; using System.Configurati ...