(给DotNet加星标,提升.Net技能)
转自: 源之缘 cnblogs.com/yuanchenhui/p/iocpcore.html
前言
本人从事编程开发十余年,因为工作关系,很早就接触socket通讯编程。常言道:人在压力下,才可能出非凡的成果。我从事的几个项目都涉及到通讯,为我研究通讯提供了平台,也带来了动力。处理socket通讯对初学者而言,具有很大的挑战性。
我有个梦想:能不能开发一套系统,能很好的实现性能和易用性的统一。高性能socket采用iocp(完成端口)是唯一选择。iocp像一匹烈马,虽然性能优良,但不宜驯服。
本套系统为这匹烈马套上了枷锁,让他变得温顺;但是,当你需要他时,又能迸发出强劲的动力。本文就介绍该系统如何实现易用性和高性能的统一。
此库的特点:高性能与易用性完美统一;全部自主编码,反复测试,尽最大程度做到了bug free。
基于本文介绍的网络模块,开发的文件快速传输系统。
系统简介
1、系统采用c#,可以在.net core平台编译通过。所以可运行在windows、linux平台。
2、系统有两个模块组成IocpCore,EasyNetMessage。IocpCore对完成端口进行了封装,EasyNetMessage在IocpCore基础上进一步封装,实现了易用性。可在EasyNetMessage基础上,进一步扩展,实现分布式系统(类似WCF)。
3、系统只实现了TCP通讯,秉承simple is best的理念,不为过于冗余的功能干扰。
4、系统突出专业性(professional)。为了测试稳定性,开发了专门的测试程序,反复对系统蹂躏,检验系统的稳定性。为了测试性能,做了精确计时,检验每个功能点的效率。
网上也有很多第三方网络库,好像没有必要再另起炉灶。但这些库大部分无法满足专业性、易用性要求。通过对系统API封装,可以完全了解底层特性,由于所有代码都是自己亲自编写,做到了心中有数,对所有代码了然于心。即使系统出现bug,也可以很快解决。
性能指标
Iocp是可扩展性通讯模型,就是不随着连接数增加而导致性能下降。所支持的连接数只与平台硬件有关。本系统保守估计可以支持10万个连接。普通平台下,可以满足千兆网传输需求。
设计思路
如果网络库可以用到各种场景,所处理的逻辑必须与业务无关。系统采用分层处理,底层处理字节流的收发,完全与业务无关。底层的目标就是收发速度足够快。
再上一层,就是对完整的数据包处理,处理的关键是如何将数据流分割成完整的数据包。再向上就是应用层,将收到的数据包转换成类,上层只需对c#类处理,不用关心底层细节。
IocpCore 模块介绍
本模块对iocp封装,充分挖掘iocp的潜质;可以处理字节流也可以处理一个完整的包。
对外接口:
public class SocketEventParam
{
public EN_SocketEvent SocketEvent;
public SocketClientInfo ClientInfo;
public Socket Socket;
public byte[] Data { get; set; }
public SocketEventParam(EN_SocketEvent socketEvent, Socket socket){
SocketEvent = socketEvent;
Socket = socket;
}<