![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
并发处理
文章平均质量分 92
Andrewniu
这个作者很懒,什么都没留下…
展开
-
Windows服务器高并发处理IOCP(完成端口)详细说明
本系列里完成端口的代码在两年前就已经写好了,但是由于许久没有写东西了,不知该如何提笔,所以这篇文档总是在酝酿之中……酝酿了两年之后,终于决定开始动笔了,但愿还不算晚….. 这篇文档我非常详细并且图文并茂的介绍了关于网络编程模型中完成端口的方方面面的信息,从API的用法到使用的步骤,从完成端口的实现机理到实际使用的注意事项,都有所涉及,并且为了让朋友们更直观的体会完成端口的用法转载 2018-05-07 17:26:08 · 463 阅读 · 0 评论 -
C#高性能大容量SOCKET并发(十一):编写上传客户端
客户端封装整体框架客户端编程基于阻塞同步模式,只有数据正常发送或接收才返回,如果发生错误则抛出异常,基于TcpClient进行封装,主要类结构如下图:TcpClient:NET系统封装,实现了底层Socket操作,提供了阻塞和非阻塞调用;OutgoingDataAssembler m_outgoingDataAssembler:协议组装器,用来组装往外发送的命令,主要用于组装协议格式;Dynami...转载 2018-05-08 09:13:21 · 480 阅读 · 0 评论 -
C#高性能大容量SOCKET并发(十):SocketAsyncEventArgs线程模型
线程模型SocketAsyncEventArgs编程模式不支持设置同时工作线程个数,使用的NET的IO线程,由NET底层提供,这点和直接使用完成端口API编程不同。NET底层IO线程也是每个异步事件都是由不同的线程返回到Completed事件,因此在Completed事件需要对用户对象进行加锁,避免同一个用户对象同时触发两个Completed事件。[csharp] view plain copy ...转载 2018-05-08 09:12:51 · 1150 阅读 · 0 评论 -
C#高性能大容量SOCKET并发(九):断点续传
上传断点续传断点续传主要是用在上传或下载文件,一般做法是开始上传的时候,服务器返回上次已经上传的大小,如果上传完成,则返回-1;下载开始的时候,由客户端上报本地已经下载大小,服务器根据位置信息下发数据,因此上传下载协议都需要带Size大小,例如我们协议格式。上传开始:客户端->服务器{[Request]Command=UploadDir=Dir ...转载 2018-05-08 09:12:22 · 811 阅读 · 0 评论 -
C#高性能大容量SOCKET并发(八):通讯协议
协议种类开发Socket程序有两种协议类型,一种是用文本描述的,类似HTTP协议,定义字符集,好处是兼容性和调试方便,缺点是解析文本会损耗一些性能;一种是用Code加结构体,定义字节顺序,好处是性能高,缺点是兼容性和调试不方便。这个可以根据应用场景灵活选择,如果您的应用相对稳定,需求变化少,性能要求高,则可以使用Code加结构体的方式。如果您的应用需要不停的扩充功能,但是对性能要求不苛刻,则可以使...转载 2018-05-08 09:11:33 · 700 阅读 · 0 评论 -
C#高性能大容量SOCKET并发(七):协议字符集
UTF-8UTF-8是UNICODE的一种变长字符编码又称万国码,由Ken Thompson于1992年创建。现在已经标准化为RFC 3629。UTF-8用1到6个字节编码UNICODE字符。用在网页上可以同一页面显示中文简体繁体及其它语言(如日文,韩文)。使用UTF-8的好处是现在一些手机平台都是使用UTF-8,另外在一些嵌入式平台,如果不支持中文,只支持英文,可以不转换,UTF-8就可以识别。...转载 2018-05-08 09:11:02 · 332 阅读 · 0 评论 -
C#高性能大容量SOCKET并发(六):超时Socket断开(守护线程)和心跳包
守护线程在服务端版Socket编程需要处理长时间没有发送数据的Socket,需要在超时多长时间后断开连接,我们需要独立一个线程(DaemonThread)来轮询,在执行断开时,需要把Socket对象锁定,并调用CloseClientSocket来断开连接,具体处理代码如下:[csharp] view plain copy namespace SocketAsyncSvr { class...转载 2018-05-08 09:10:33 · 732 阅读 · 0 评论 -
C#高性能大容量SOCKET并发(五):粘包、分包、解包
粘包使用TCP长连接就会引入粘包的问题,粘包是指发送方发送的若干包数据到接收方接收时粘成一包,从接收缓冲区看,后一包数据的头紧接着前一包数据的尾。粘包可能由发送方造成,也可能由接收方造成。TCP为提高传输效率,发送方往往要收集到足够多的数据后才发送一包数据,造成多个数据包的粘连。如果接收进程不及时接收数据,已收到的数据就放在系统接收缓冲区,用户进程读取数据时就可能同时读到多个数据包。粘包一般的解决...转载 2018-05-08 09:09:57 · 1156 阅读 · 0 评论 -
C#高性能大容量SOCKET并发(四):缓存设计
在编写服务端大并发的应用程序,需要非常注意缓存设计,缓存的设计是一个折衷的结果,需要通过并发测试反复验证。有很多服务程序是在启动时申请足够的内存空间,避免在运行期间再申请空间,这种是固定空间申请。还有一种是在运行期间动态增长的缓存设计,随着运行动态申请内存,这种事动态空间申请。这两种机制各有优劣,固定空间申请优点是效率高,运行稳定,缺点是对应用场景具有限制;动态空间申请优点是能适应更好的应用场景,...转载 2018-05-07 17:41:35 · 1524 阅读 · 0 评论 -
C#高性能大容量SOCKET并发(三):接收、发送
异步数据接收有可能收到的数据不是一个完整包,或者接收到的数据超过一个包的大小,因此我们需要把接收的数据进行缓存。异步发送我们也需要把每个发送的包加入到一个队列,然后通过队列逐个发送出去,如果每个都实时发送,有可能造成上一个数据包未发送完成,这时再调用SendAsync会抛出异常,提示SocketAsyncEventArgs正在进行异步操作,因此我们需要建立接收缓存和发送缓存。接收通过Complet...转载 2018-05-07 17:41:05 · 5270 阅读 · 0 评论 -
C#高性能大容量SOCKET并发(二):SocketAsyncEventArgs封装
1、SocketAsyncEventArgs介绍SocketAsyncEventArgs是微软提供的高性能异步Socket实现类,主要为高性能网络服务器应用程序而设计,主要是为了避免在在异步套接字 I/O 量非常大时发生重复的对象分配和同步。使用此类执行异步套接字操作的模式包含以下步骤: 1.分配一个新的 SocketAsyncEventArgs 上下文对象,或者从应用程序池中获取一个空闲的此类对...转载 2018-05-07 17:40:29 · 1022 阅读 · 0 评论 -
C#高性能大容量SOCKET并发(一):IOCP完成端口例子介绍
例子主要包括SocketAsyncEventArgs通讯封装、服务端实现日志查看、SCOKET列表、上传、下载、远程文件流、吞吐量协议,用于测试SocketAsyncEventArgs的性能和压力,最大连接数支持65535个长连接,最高命令交互速度达到250MB/S(使用的是127.0.0.1的方式,相当于千兆网卡1Gb=125MB/S两倍的吞吐量)。服务端用C#编写,并使用log4net作为日志...转载 2018-05-07 17:39:56 · 1535 阅读 · 0 评论 -
C#高性能大容量SOCKET并发(零):代码结构说明
C#版完成端口具有以下特点:连接在线管理(提供在线连接维护,连接会话管理,数据接收,连接断开等相关事件跟踪);发送数据智能合并(组件会根据资源使用情况,对多个同时发送向同一连接的多个消息数据进行合并写入缓冲区;内存池管理(提供一系列的接收和发送buffer可复用池);数据读写封装;通讯协议封装;由不同的类负责实现,比MSDN的例子代码多了不少逻辑,为了方便大家阅读和理解,把整体类框架设计整体如下。...转载 2018-05-07 17:39:25 · 418 阅读 · 0 评论 -
C#高性能大容量SOCKET并发(转)
C#高性能大容量SOCKET并发(零):代码结构说明 C#高性能大容量SOCKET并发(一):IOCP完成端口例子介绍C#高性能大容量SOCKET并发(二):SocketAsyncEventArgs封装C#高性能大容量SOCKET并发(三):接收、发送C#高性能大容量SOCKET并发(四):缓存设计C#高性能大容量SOCKET并发(五):粘包、分包、解包 C#高性能大容量SOCKET并发(六):超...转载 2018-05-07 17:38:57 · 1502 阅读 · 0 评论 -
C# IOCP完成端口模型(简单实用高效)
1、在C#中,不用去面对完成端口的操作系统内核对象,Microsoft已经为我们提供了SocketAsyncEventArgs类,它封装了IOCP的使用。请参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socketasynceventargs.aspx?cs-save-lang=1&cs-lang=cpp#cod...转载 2018-05-07 17:27:29 · 4805 阅读 · 0 评论 -
关于同步,异步,阻塞,非阻塞,IOCP/epoll,select/poll,AIO ,NIO ,BIO,MQ的总结
对于结构复杂的编程,尤其是出现并发需求的时候,进行IO操作会遇到标题所示的一系列问题,但这些问题不是一个级别的,故不能一概而论。其中,同步,异步为最基本的概念;其次,阻塞,非阻塞是同步处理的策略,而IOCP则是异步处理策略;再次,RabbitMQ, ZeroMQ, Kafka等MQ则是基于异步的封装插件。因此,这不是一个层面的概念。---个人理解而已。相关资料IO基本概念Linux环境同步异步阻塞...转载 2018-05-08 11:43:52 · 504 阅读 · 0 评论