阅读更多

HP-Socket

 

HP-Socket 是一套通用的高性能 Windows Socket 组件包,包含服务端组件(IOCP 模型)和客户端组件(Event Select 模型),广泛适用于 Windows 平台的 TCP/UDP 通信系统。HP-Socket 对通信层实现完全封装,上层应用不必关注通信层的任何细节;HP-Socket 提供基于事件通知模型的 API 接口,能非常简单高效地整合到各类应用程序中;另外,为了让大家能更方便的学习 HP-Socket,特此精心制作了功能测试示例(Test Echo)、性能测试示例(Test Echo-PFM)、PULL 模型测试示例(Test Echo-Pull) 和 UDP 测试示例(Test Echo-UDP),用户可以通过这几个测试示例入手,迅速掌握组件的设计思想和使用方法。

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

通用性

  • 通信组件的唯一职责就是接受和发送字节流,绝对不能参与上层协议解析等工作;
  • 与上层使用者解耦、互不依赖,组件与使用者通过操作接口和监听器接口进行交互,组件实现操作接口为上层提供操作方法;使用者实现监听器接口把自己注册为组件的 Listener,接收组件通知。因此,任何使用者只要实现了监听器接口都可以使用组件;另一方面,甚至可以自己重新写一个实现方式完全不同的组件实现给使用者调用,只要该组件遵从组件的操作接口,这也是 DIP 设计原则的体现。

可用性

  可用性对所有通用组件都是至关重要的,如果太难用还不如自己重头写一个来得方便。因此,组件的操作接口和监听器接口设计得尽量简单易用(通俗来说就是“傻瓜化”),这两个接口的主要方法均不超过 5 个。另外,组件完全封装了所有的底层 Socket 通信,上层应用看不到任何通信细节,不必也不能干预任何通信操作,Socket 连接被抽象为 Connection ID,该参数作为连接标识提供给上层应用识别不同的连接。

高性能

  作为底层的通用组件,性能问题是必须考虑的,绝对不能成为系统的瓶颈。而另一方面,从实际出发,根据客户端组件与服务端组件的性能要求采用不同的 Socket 模型。组件在设计上充分考虑了性能、现实使用情景、可用性和实现复杂性等因素,确保满足性能要求的同时又不会写得太复杂。做出以下两点设计决策:

  • 客户端:在单独线程中实现 Socket 通信交互。这样可以避免与主线程或其他线程相互干扰;I/O 模型选择 Event Select 通信模型。
  • 服务端:采用 Windows 平台效率最高的 IOCP 通信模型;利用缓存池技术,在通信的过程中,通常需要频繁的申请和释放内存缓冲区,建立了动态缓存池, 只有当缓存池中没有可用对象时才创建新对象,而当缓存对象过多时则会压缩缓存池;另外,组件的动态内存通过私有堆(Private Heap)机制分配,避免与 new / malloc 竞争同时又减少内存空洞。

伸缩性

  可以根据实际的使用环境要求设置组件的各项性能参数(如:工作线程的数量、各种缓存池的大小、收发缓冲区的大小、Socket 监听队列的大小、Accep 派发的数目以及心跳检查的间隔等)。

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


*** v3.1.1 更新 ***

 > 增加导出纯 C 函数的动态链接库 HPSocket4C.dll:

-----------------
  1. 增加代码文件 HPSocket4C.h 和 HPSocket4C.cpp,用于创建 HPSocket4C.dll
  2. 导出纯 C 函数,让其它语言(如:C/C#/Delphi 等)能方便地使用 HPSocket
  3. HPSocket4C.dll 使用方法
    方法一:
    ------------------------------------------------------------------------------
    (0) (C/C++ 程序)包含 HPSocket4C.h 头文件
    (1) 调用 ::Create_HP_XxxListener() 函数创建监听器对象
    (2) 调用 ::Create_HP_Xxx(pListener) 函数创建 HPSocket 对象
    (3) 调用 ::HP_Set_FN_Xxx_OnYyy(pListener, ...) 函数设置监听器的回调函数
    (4) 调用相关导出函数操作 HPSocket 对象
    (5) ...... ......
    (6) 调用 ::Destroy_HP_Xxx(pSocket) 函数销毁 HPSocket 对象
    (7) 调用 ::Destroy_HP_XxxListener(pListener) 函数销毁监听器对象
    
    方法二:
    ------------------------------------------------------------------------------
    (1) 应用程序把需要用到的导出函数封装到特定语言的包装类中
    (2) 通过包装类封装后,以面向对象的方式使用 HPSocket
  4. 动态链接库发行版本
    (1) x86/HPSocket4C.dll		- (32位/MBCS/Release)
    (2) x86/HPSocket4C_D.dll	- (32位/MBCS/DeBug)
    (3) x86/HPSocket4C_U.dll	- (32位/UNICODE/Release)
    (4) x86/HPSocket4C_UD.dll	- (32位/UNICODE/DeBug)
    (5) x64/HPSocket4C.dll		- (64位/MBCS/Release)
    (6) x64/HPSocket4C_D.dll	- (64位/MBCS/DeBug)
    (7) x64/HPSocket4C_U.dll	- (64位/UNICODE/Release)
    (8) x64/HPSocket4C_UD.dll	- (64位/UNICODE/DeBug)

> 全面启用 Buffer Pool 缓存机制:

-----------------
  1. Common/Src 增加代码文件 bufferpool.h 和 bufferpool.cpp,实现 Buffer Pool 缓存机制
  2. 通过 Buffer Pool 缓存机制提升内存使用效率,减少动态内存分配和释放操作,避免内存空洞
  3. ICTcpClient 用 CItemPool 和 TItemList 实现发送缓冲区
  4. CUdpClient 用 CItemPool 和 TItemList 实现发送缓冲区
  5. CTcpPullClient 用 CItemPool 和 TItemList 实现发送缓冲区和 PULL 缓冲区
  6. CTcpPullServer 用 CBufferPool 和 TBuffer 实现 PULL 缓冲区

> 其它更新:

-----------------
  1. HPSocket.dll 和 HPSocket4C.dll 使用 /MT(d) 选项重新编译,消除对运行时库的依赖
  2. IServer 增加接口方法 DisconnectLongConnections() 用于断开所有超长连接
  3. IServer 删除接口方法 GetConnectionCriSec()
  4. IClient 增加方法 Get/SetFreeBufferPoolSize()、Get/SetFreeBufferPoolHold() 用于设置 Buffer Pool 缓存大小和阀值
  5. IPullServer 删除方法 Get/SetFreePullBufferPool()、Get/SetFreePullBufferHold()
  6. 增加示例工程 TestEcho-4C,展示 HPSocket4C.dll 的使用方法

> 升级说明:

-----------------
  1. 使用 HP-Socket v3.0.2 及以前版本的应用程序可以安全升级到 HP-Socket v3.1.1
  2. 如果工程想通过导入 HPSocket4C.dll 的方式使用 HP-Socket,请参考 TestEcho-4C 示例工程

*** v3.0.2 更新 ***

 > 把 HP-Socket 编译为动态链接库:

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

  1. 应用程序可以通过导入源代码或动态链接库方式使用 HP-Socket
  2. 动态链接库使用方法
    方法一:
    ------------------------------------------------------------------------------
    (0) 应用程序包含 SocketInterface.h 和 HPSocket.h 头文件
    (1) 调用 HP_Create_Xxx() 函数创建 HPSocket 对象
    (2) 使用完毕后调用 HP_Destroy_Xxx() 函数销毁 HPSocket 对象
    
    方法二:
    ------------------------------------------------------------------------------
    (0) 应用程序包含 SocketInterface.h 和 HPSocket.h 头文件
    (1) 创建 CXxxWrapper 包装器,通过包装器智能指针使用 HPSocket 对象
  3. 动态链接库发行版本
    (1) x86/HPSocket.dll      - (32位/MBCS/Release)
    (2) x86/HPSocket_D.dll    - (32位/MBCS/DeBug)
    (3) x86/HPSocket_U.dll    - (32位/UNICODE/Release)
    (4) x86/HPSocket_UD.dll   - (32位/UNICODE/DeBug)
    (5) x64/HPSocket.dll      - (64位/MBCS/Release)
    (6) x64/HPSocket_D.dll    - (64位/MBCS/DeBug)
    (7) x64/HPSocket_U.dll    - (64位/UNICODE/Release)
    (8) x64/HPSocket_UD.dll   - (64位/UNICODE/DeBug)

*** v3.0.1 更新 ***

 > 新增 UDP 通信组件:

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

  1. 新增两个 UDP 通信组件:CUdpServer 为服务端组件,CUdpClient 为客户端组件
  2. 服务端组件 CUdpServer 采用 IOCP 通信模型
  3. 客户端组件 CUdpClient 采用 Event Select 通信模型
  4. UDP 通信组件的接口与原 TCP 通信组件一致,简单实用
  5. UDP 通信组件内置通信线路自动监测机制
  6. 新增 UDP 通信组件示例工程 TestEcho-UDP

> 代码重构与优化:

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

  1. 规范所有接口、类以及代码文件的命名
  2. 重构和优化了大量组件代码
  3. 服务端组件加入读写锁机制,有效平衡处理性能与安全性
  4. 服务端组件的 Socket 对象缓存列表设置了锁定时间,提高访问的安全性

*** v2.2.3 更新 ***

 > 连接 ID 的数据类型改为 ‘CONNID’:

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

  1. 在SocketHelper.h 中定义 CONNID 数据类型(默认:typedef ULONG_PTR CONNID)
  2. 应用程序可以把 CONNID 定义为其希望的类型(如:ULONG / ULONGLONG 等)
  3. 为了便于移植与维护,应用程序的任何地方都应该用‘CONNID’类型引用连接 ID

> 服务端 Socket 组件支持为每个连接绑定附加数据:

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

  1. IServerSocket 和 CIocpServer 增加方法 Get/SetConnectionExtra()
  2. 通过上述两个方法,应用程序可以为每个连接绑定任意附加数据并把数据获取出来

*** v2.2.2 更新 ***

  > 优化心跳检测相关功能:

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

  1. IServerSocket 和 IClientSocket 的 Get/SetKeepAliveTimes() 方法改为 Get/SetKeepAliveTime()
  2. CIocpServer 和 CClientSocket 的默认 KeepAliveTime 属性改为 5000
  3. CIocpServer 和 CClientSocket 的默认 KeepAliveInterval 属性改为 3000

*** 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

9
0
评论 共 2 条 请登录后发表评论
2 楼 tmj_159 2014-01-03 16:25
guaishou 写道
anybody say something ...

是否开源,作者,相同产品优势。
1 楼 guaishou 2013-12-27 13:55
anybody say something ...

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • 在DELPHI中利用ADO组件访问数据库的步骤

    今天我在DELPHI中利用ADO组件成功连接了数据库,下面是一般步骤:1.新建工程2.在窗体中添加TADOConnection组件,并设置其ConnectionString属性,以便连接数据库。3.添加TADOTable组件, 并设置其Connection属性为ADOConnection1.从TableName属性中选择数据表。4.添加TDataSource组件,设置其DataSet属性为ADOT

  • Delphi的学习笔记十五——数据库编程1

    Delphi7中有许多对数据库操作的组件,他们因数据访问机制的不同而被分成四大类: 1.BDE组件:使用Borland数据库引擎,它最擅长处理Paradox or dBASE表中的数据。但它的配置也是四个机制中最为复杂的;同时,BDE组件能与其它采用BDE组件的应用程序共享。在Delphi7的操作界面,我们能看到在BDE组件中包含TTable组件(用于通过BDE从物理数据库中获得数据,并经过TD

  • 数据库访问组件ADO

    ADO教程

  • 用ADO常用的连接方式和访问加密的ACCESS数据库

    在stdafx.h中添加一句指令: #import "c:\program files\common files\system\ado\msado15.dll" \ no_namespace \ rename ("EOF", "adoEOF") COM库的初始化在CWinApp::InitInstance()的重载函数中添加:AfxOleInit(),代码如下: BOOL C

  • VC++下使用ADO访问Access数据库完整篇

    1、在StdAfx.h中引入ADO类支持 方法是在StdAfx.h中增加下面两句话: #include //如果需要则添加本句 #import "c:\program files\common files\system\ado\msado15.dll" no_namespace rename ("EOF", "adoEOF") 2、初始化COM环境 在MFC中可以用AfxOleInit(

  • Delphi中使用ADO访问Paradox表

    Paradox是Borland早期推出的桌面型数据库,尽管现在已经趋于淘汰,但是依然有部分企业仍在用Paradox数据库。Paradox数据库有一些特性(也可以说是缺点)是和现有数据库完全不一样的,这导致了程序员在使用Paradox数据库时往往陷入困境,现在就介绍一些关于Paradox数据库的信息,希望对大家有所帮助。首先,Paradox推出是在Ansi-SQL-92标准推出之前,所以Pa

  • OleDb显示dBase、Paradox表的乱码问题的解决

     OleDb连接Paradox表,显示为乱码时,可使用Delphi 7的Database Desktop将表的Table Properties中Table Language属性修改为:Paradox China 936。OleDb连接dBase表时,也会显示乱码,可使用Delphi 7的Database Desktop将表的Table Properties中Table Language属性

  • ADO数据库访问技术

    一、ADO(active data object,活动数据对象)实际上是一种基于COM(组件对象模型)的自动化接口技术,并以OLE DB(对象连接和镶入的数据库)为基础,经过OLE DB精心包装后的数据库访问技术,利用它可以快速的创建数据库应用程序。ADO提供了一组非常简单,将一般通用的数据访问细节进行封装的对象。由于ODBC数据源也提供了一般的OLE DB Privider,所以ADO不仅可以应

  • delphi sqlite 避免DataBase is Locked

    如果可能,后续的写入语句会将事务升级为写入事务,或者返回 SQLITE_BUSY。UpdateOptions.lockwait : 其它进程处于事务或写状态时,会阻止当前进程进入事务或写数据,这时是否等待,等待时间为BusyTimeout,如果超时,会报database is locked错误。设置成其它参数时,可以两个进程同时进入事务状态,但如果一个进程于事务中执行了写数据。处于事务中时,读不到其它表的更新,但写数据时是受其它事务影响的,按数据库当前最新数据进行的。其它进程不可以执行写入操作。

  • delphi 远程 mysql_Delphi远程连接Mysql的实现方法

    本文实例讲述了Delphi远程连接Mysql的实现方法,是Delphi数据库程序设计中非常重要的技巧。分享给大家供大家参考之用。具体方法如下:Delphi 通过ADOConnection链接远程Mysql数据库,要在安装软件的电脑上安装Mysql 驱动,没有的在百度下载,搜索mysql ODBC驱动就出来了主要的链接代码如下:var srstring:string;srstring:='DRIVE...

  • Delphi TDatabase 组件

    TDatabase 组件是一个能与远程数据库通过 BDE 建立连接的组件,可使本地端的程序获取远程的数据。 通过 TDatabase 组件的使用,可以减少与远程数据库连接的窗口,当远程数据库的设置变动时,只要更改 TDatabase 组件的单一窗口即可,对于同一个数据库的连接,所有 TTable, TQuery 或其他的 BDE 数据访问组件都可以通过 TDatabase 组件与远程数据...

  • 系统公用函数及过程

    {▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎}{▎                                                                          ▎}{▎                             系统公用函数及过程                            ▎}{▎         

  • Delphi字符串操作的常用函数二

    1.LeftStr(返回从字符串首开始指定长度的子字符串) function LeftStr(const AText: AnsiString; const ACount: Integer): AnsiString; overload; function LeftStr(const AText: WideString; const ACount: Integer): WideString; ov

  • DataSource数据源简单理解

    DataSource数据源简单理解 因为热爱,所以拼搏。 –RuiDer 什么是数据源 JDBC2.0 提供了javax.sql.DataSource接口,它负责建立与数据库的连接,当在应用程序中访问数据库时 不必编写连接数据库的代码,直接引用DataSource获取数据库的连接对象即可。用于获取操作数据Connection对象。 数据源与数...

  • DataSet类和DataSource属性

    DataSet类和DataSource属性 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 开发工具与关键技术: 作者:刘海红 撰写时间: 2019年7月31日 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~...

Global site tag (gtag.js) - Google Analytics