通用高机能 Windows Socket 组件 HP-Socket v2.2.1 增长 PULL 模

    添加时间:2013-6-13 点击量:

      HP-Socket 是一套通用的高机能 Windows Socket 组件包,包含办事端组件(IOCP 模型)和客户端组件(Event Select 模型),广泛实用于 Windows 平台的 TCP 通信体系。HP-Socket 对通信层实现完全封装,上层应用不必存眷通信层的任何细节;HP-Socket 供给基于事务通知模型的 API 接口,能很是简单高效地整合到各类应用法度中;别的,为了让大师能更便利的进修 HP-Socket,特此精心建造了一个功能测试示例(Test Echo)一个机能测试示例(Test Echo-PFM)一个 PULL 模型测试示例(Test Echo-Pull),用户可以经由过程这两个测试示例入手,敏捷把握组件的设计思惟和应用办法。


    ----------------------------------------------------------------


    通用性



    • 通信组件的独一职责就是接管和发送字节俭,绝对不克不及参与上层和谈解析等工作;

    • 与上层应用者解耦、互不依附,组件与应用者经由过程操纵接口和器接口进行交互,组件实现操纵接口为上层供给操纵办法;应用者实现器接口把本身注册为组件的 Listener,接管组件通知。是以,任何应用者只要实现了器接口都可以应用组件;另一方面,甚至可以本身从头写一个实现体式格式完全不合的组件实现给应用者调用,只要该组件遵从组件的操纵接口,这也是 DIP 设计原则的表现。


    可用性


      可用性对所有通用组件都是至关首要的,若是太难用还不如本身重头写一个来得便利。是以,组件的操纵接口和器接口设计得尽量简单易用(通俗来说就是“傻瓜化”),这两个接口的首要办法均不跨越 5 个。别的,组件完全封装了所有的底层 Socket 通信,上层应用看不到任何通信细节,不必也不克不及干涉干与任何通信操纵,Socket 连接被抽象为 Connection ID,该参数作为连接标识供给给上层应用辨认不合的连接。


    高机能


      作为底层的通用组件,机能题目是必须推敲的,绝对不克不及成为体系的瓶颈。而另一方面,从实际出发,按照客户端组件与办事端组件的机能请求采取不合的 Socket 模型。组件在设计上充沛推敲了机能、实际应用情景、可用性和实现错杂性等身分,确保满足机能请求的同时又不会写得太错杂。做出以下两点设计决定计划:



    • 客户端:在零丁线程中实现 Socket 通信交互。如许可以避免与主线程或其他线程彼此干扰;I/O 模型选择 Event Select 通信模型。

    • 办事端:采取 Windows 平台效力高的 IOCP 通信模型;哄骗缓存池技巧,在通信的过程中,凡是须要频繁的申请和开释内存缓冲区,建树了动态缓存池, 只有当缓存池中没有可用对象时才创建新对象,而当缓存对象过多时则会紧缩缓存池;别的,组件的动态内存经由过程私有堆(Private Heap)机制分派,避免与 new / malloc 竞争同时又削减内存空洞。


    伸缩性


      可以按照实际的应用景象请求设置组件的各项机能参数(如:工作线程的数量、各类缓存池的大小、收发缓冲区的大小、Socket 队列的大小、Accep 派发的数量以及心跳搜检的间隔等)。


      (项目主页:点击这里,地址:点击这里)




     PUSH / PULL 模型简介:


      通信组件向上层应用提交数占领以下两种模式:



    1. PUSH 模型:当通信组件接管到数据后调用应用接口的 OnReceive(dwConnID, const BYTE pData, int iLength) 办法向应用法度推送数据,应用法度实现该办法并在办法内部取得 pData 进行处理惩罚。

    2. PULL 模型:当通信组件接管到数据后调用应用接口的 OnReceive(dwConnID, int iTotalLength) 办法(重视,不包含 pData 参数)通知应用法度有 iLength 长度的数据可取,若是应用法度认为该长度的数据能构成一个完全的数据包则调用通信组件的 Fetch(BYTE pData, int iDataLength) 办法抓取 iDataLength 长度的数据(iDataLength <= iTotalLength)。



      此中 PUSH 模型效力相对较高,但应用法度本身要负责处理惩罚解包和粘包等题目,带来必然的错杂性;PULL 模型则相对简单,只要上层和谈定义得足够严谨(PULL 模型的数据包凡是划分为 Header 数据包和 Body 数据包),能大大简化数据包处理惩罚工作,但因为组件中心加了一个间接层,效力往往低于 PUSH模型。




     更新记录:


      v2.2.1 更新


    > PULL 模型支撑:


    -----------------



    1. ISocketListener 增长 PULL 模型数据接管通知办法 OnReceive(dwConnID, int)

    2. 增长 PULL Socket 接口 IPullSocket,该接口的 Fetch(dwConnID, pBuffer, iLength) 办法用于抓取通信数据












    > Server:


    -----------------



    1. 办事端 Socket 接口 ISocketServer 改名为 IServerSocket

    2. 增长 PULL Server Socket 器抽象类 CPullServerSocketListener

    3. 增长 PULL Server Socket 接口 IPullServerSocket

    4. 增长 PULL Server Socket 实现类 CIocpPullServer












    > Client:


    -----------------



    1. 客户端 Socket 接口 ISocketClient 改名为 IClientSocket

    2. 客户端 Socket 实现类 CSocketClient 改名为 CClientSocket

    3. 增长 PULL Client Socket 器抽象类 CPullClientSocketListener

    4. 增长 PULL Client Socket 接口 IPullClientSocket

    5. 增长 PULL Client Socket 实现类 CPullClientSocket  












    > 其它更新:
    -----------------



    1. 增长 PULL Socket 测试法度 TestEcho-Pull

    2. 在 SocketHelper.h (.cpp) 中添加若干帮助布局体














    > 进级申明:
    -----------------



    1. 应用 HP-Socket v2.1.1 的应用法度可以安然进级到 v2.2.1

    2. 因为 ISocketServer、ISocketClient 和 CSocketClient 的名称已批改,是以,应用法度须要对引用的名称和包含的头文件名作响应批改






     相干博文:


    《高机能 Windows Socket 办事端与客户端组件(源代码及测试用例)


    《基于 IOCP 的通用异步 Windows Socket TCP 高机能办事端组件的设计与实现


    《通用异步 Windows Socket TCP 客户端组件的设计与实现


    CodeProject

    我们永远不要期待别人的拯救,只有自己才能升华自己。自己已准备好了多少容量,方能吸引对等的人与我们相遇,否则再美好的人出现、再动人的事情降临身边,我们也没有能量去理解与珍惜,终将擦肩而过。—— 姚谦《品味》
    分享到: