高性能大容量SOCKET并发
文章平均质量分 89
SQLDebug_Fan
05年开始编程,刚开始做财务软件,现从事Windows服务端程序开发,对于SOCKET多线程并发同步异步SQLServer性能条件遇到问题较多,现在开始学习C服务端开发和性能计数器调校
展开
-
C#高性能大容量SOCKET并发(零):代码结构说明
C#版完成端口具有以下特点:连接在线管理(提供在线连接维护,连接会话管理,数据接收,连接断开等相关事件跟踪);发送数据智能合并(组件会根据资源使用情况,对多个同时发送向同一连接的多个消息数据进行合并写入缓冲区;内存池管理(提供一系列的接收和发送buffer可复用池);数据读写封装;通讯协议封装;原创 2014-04-07 22:35:48 · 34938 阅读 · 29 评论 -
C#高性能大容量SOCKET并发(一):IOCP完成端口例子介绍
例子主要包括SocketAsyncEventArgs通讯封装、服务端实现日志查看、SCOKET列表、上传、下载、远程文件流、吞吐量协议,用于测试SocketAsyncEventArgs的性能和压力,最大连接数支持65535个长连接,最高命令交互速度达到250MB/S(使用的是127.0.0.1的方式,相当于千兆网卡1Gb=125MB/S两倍的吞吐量)。服务端用C#编写,并使用log4net作为日志模块。原创 2014-01-22 15:49:50 · 61372 阅读 · 60 评论 -
C#高性能大容量SOCKET并发(二):SocketAsyncEventArgs封装
SocketAsyncEventArgs是微软提供的高性能异步Socket实现类,主要为高性能网络服务器应用程序而设计,主要是为了避免在在异步套接字 I/O 量非常大时发生重复的对象分配和同步。原创 2014-03-04 15:28:39 · 68063 阅读 · 37 评论 -
C#高性能大容量SOCKET并发(四):缓存设计
在编写服务端大并发的应用程序,需要非常注意缓存设计,缓存的设计是一个折衷的结果,需要通过并发测试反复验证。有很多服务程序是在启动时申请足够的内存空间,避免在运行期间再申请空间,这种是固定空间申请。还有一种是在运行期间动态增长的缓存设计,随着运行动态申请内存,这种事动态空间申请。这两种机制各有优劣,固定空间申请优点是效率高,运行稳定,缺点是对应用场景具有限制;动态空间申请优点是能适应更好的应用场景,缺点是效率相对低一些,并发数降一些;这种性能下降不是太明显,毕竟申请释放内存的效率NET是有优化的,具体需要根据原创 2014-03-05 17:30:32 · 22334 阅读 · 4 评论 -
C#高性能大容量SOCKET并发(八):通讯协议
开发Socket程序有两种协议类型,一种是用文本描述的,类似HTTP协议,定义字符集,好处是兼容性和调试方便,缺点是解析文本会损耗一些性能;一种是用Code加结构体,定义字节顺序,好处是性能高,缺点是兼容性和调试不方便。这个可以根据应用场景灵活选择,如果您的应用相对稳定,需求变化少,性能要求高,则可以使用Code加结构体的方式。如果您的应用需要不停的扩充功能,但是对性能要求不苛刻,则可以使用文本解析的方式。这两种协议有两个比较典型的应用场景,Code加结构体更多应用在中间件上,因为协议的封装都是透明的,不需原创 2014-03-07 15:54:42 · 14600 阅读 · 2 评论 -
C#高性能大容量SOCKET并发(十):SocketAsyncEventArgs线程模型
SocketAsyncEventArgs编程模式不支持设置同时工作线程个数,使用的NET的IO线程,由NET底层提供,这点和直接使用完成端口API编程不同。NET底层IO线程也是每个异步事件都是由不同的线程返回到Completed事件,因此在Completed事件需要对用户对象进行加锁,避免同一个用户对象同时触发两个Completed事件。原创 2014-03-07 17:18:22 · 18439 阅读 · 6 评论 -
C#高性能大容量SOCKET并发(三):接收、发送
异步数据接收有可能收到的数据不是一个完整包,或者接收到的数据超过一个包的大小,因此我们需要把接收的数据进行缓存。异步发送我们也需要把每个发送的包加入到一个队列,然后通过队列逐个发送出去,如果每个都实时发送,有可能造成上一个数据包未发送完成,这时再调用SendAsync会抛出异常,提示SocketAsyncEventArgs正在进行异步操作,因此我们需要建立接收缓存和发送缓存。原创 2014-03-04 16:57:11 · 35180 阅读 · 37 评论 -
C#高性能大容量SOCKET并发(六):超时Socket断开(守护线程)和心跳包
在服务端版Socket编程需要处理长时间没有发送数据的Socket,需要在超时多长时间后断开连接,我们需要独立一个线程(DaemonThread)来轮询,在执行断开时,需要把Socket对象锁定,并调用CloseClientSocket来断开连接。有超时连接,相对应的需要设计心跳包,心跳包用来检测连接和维护连接状态,心跳包的原理是客户端发送一个包给服务器,服务器收到后发一个响应包给客户端,通过检测是否有返回来判断连接是否正常。原创 2014-03-07 15:06:22 · 27973 阅读 · 28 评论 -
C#高性能大容量SOCKET并发(七):协议字符集
UTF-8是UNICODE的一种变长字符编码又称万国码,由Ken Thompson于1992年创建。现在已经标准化为RFC 3629。UTF-8用1到6个字节编码UNICODE字符。用在网页上可以同一页面显示中文简体繁体及其它语言(如日文,韩文)。使用UTF-8的好处是现在一些手机平台都是使用UTF-8,另外在一些嵌入式平台,如果不支持中文,只支持英文,可以不转换,UTF-8就可以识别。NET默认支持的编码是Unicode,为了支持UTF-8,需要转换下,为了编程简便性,我们只在发包和解包的地方进行UT原创 2014-03-07 15:34:39 · 10587 阅读 · 1 评论 -
C#高性能大容量SOCKET并发(五):粘包、分包、解包
使用TCP长连接就会引入粘包的问题,粘包是指发送方发送的若干包数据到接收方接收时粘成一包,从接收缓冲区看,后一包数据的头紧接着前一包数据的尾。粘包可能由发送方造成,也可能由接收方造成。TCP为提高传输效率,发送方往往要收集到足够多的数据后才发送一包数据,造成多个数据包的粘连。如果接收进程不及时接收数据,已收到的数据就放在系统接收缓冲区,用户进程读取数据时就可能同时读到多个数据包。粘包一般的解决办法是制定通讯协议,由协议来规定如何分包解包,因此在Scoket编程中需要定义分包、解包的逻辑。原创 2014-03-07 11:40:41 · 49043 阅读 · 11 评论 -
C#高性能大容量SOCKET并发(九):断点续传
断点续传主要是用在上传或下载文件,一般做法是开始上传的时候,服务器返回上次已经上传的大小,如果上传完成,则返回-1;下载开始的时候,由客户端上报本地已经下载大小,服务器根据位置信息下发数据,因此上传下载协议都需要带Size大小。原创 2014-03-07 16:28:21 · 14746 阅读 · 4 评论 -
C#高性能大容量SOCKET并发(十一):编写上传客户端
C#的TcpClient封装了NET的底层Socket操作,基于TCP协议,提供了阻塞和非阻塞模式调用,具体是设置m_tcpClient.Client.Blocking = true表示使用阻塞模式,反之则使用非阻塞模式。阻塞模式表示接收完指定长度的数据才返回,非阻塞模式表示收到一点数据就返回。如我们调用m_tcpClient.Client.Receive(m_recvBuffer.Buffer, sizeof(int), packetLength, SocketFlags.None),假设传入的长度为1原创 2014-06-08 21:02:06 · 18862 阅读 · 26 评论