通用高性能Socket组件-HP-Socket
2013-06-25 14:39:08 阿炯

本站赞助商链接,请多关照。 HP-Socket 是一套通用的高性能 TCP/UDP/HTTP 通信框架,包含服务端组件、客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP/HTTP 通信系统,提供 C/C++、C#、Delphi、E(易语言)、Java、Python 等编程语言接口。HP-Socket 对通信层实现完全封装,应用程序不必关注通信层的任何细节;HP-Socket 提供基于事件通知模型的 API 接口,能非常简单高效地整合到新旧应用程序中;另外为了能更方便的学习 HP-Socket,还制作了一个功能测试示例(Test Echo),一个性能测试示例(Test Echo-PFM)和一个 PULL 测试示例(Test Echo-Pull),用户可以通过这两个测试示例入手,迅速掌握组件的设计思想和使用方法。


采用C/C++开发并在Apache协议下授权使用。

工作流程

创建监听器对象
创建组件对象(并绑定监听器)
启动组件
连接远程主机(仅用于 Agent 组件)
处理通信事件(OnConnect/OnReceive/OnClose ......)
停止组件(可选,第 7 步销毁组件对象前会先停止组件)
销毁组件对象
销毁监听器对象



特性
通用性

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

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

高性能
作为底层的通用组件,性能问题是必须考虑的,绝对不能成为系统的瓶颈。而另一方面,从实际出发,根据客户端组件与服务端组件的性能要求采用不同的 Socket 模型。组件在设计上充分考虑了性能、现实使用情景、可用性和实现复杂性等因素,确保满足性能要求的同时又不会写得太复杂。做出以下两点设计决策:
客户端:在单独线程中实现 Socket 通信交互。这样可以避免与主线程或其他线程相互干扰;I/O 模型选择 Event Select 通信模型。
服务端:采用 Windows 平台效率最高的 IOCP 通信模型;利用缓存池技术,在通信的过程中,通常需要频繁的申请和释放内存缓冲区,建立了动态缓存池, 只有当缓存池中没有可用对象时才创建新对象,而当缓存对象过多时则会压缩缓存池;另外,组件的动态内存通过私有堆(Private Heap)机制分配,避免与 new / malloc 竞争同时又减少内存空洞。

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

组件列表

基础组件


SSL 组件

    
HTTP 组件



最新版本:2.2
PULL 模型支持:
-----------------
ISocketListener 增加 PULL 模型数据接收通知方法 OnReceive(dwConnID, int)
增加 PULL Socket 接口 IPullSocket,该接口的 Fetch(dwConnID, pBuffer, iLength) 方法用于抓取通信数据

Server:
-----------------
服务端 Socket 接口 ISocketServer 改名为 IServerSocket
增加 PULL Server Socket 监听器抽象类 CPullServerSocketListener
增加 PULL Server Socket 接口 IPullServerSocket
增加 PULL Server Socket 实现类 CIocpPullServer

Client:
-----------------
客户端 Socket 接口 ISocketClient 改名为 IClientSocket
客户端 Socket 实现类 CSocketClient 改名为 CClientSocket
增加 PULL Client Socket 监听器抽象类 CPullClientSocketListener
增加 PULL Client Socket 接口 IPullClientSocket
增加 PULL Client Socket 实现类 CPullClientSocket

其它更新:
-----------------
增加 PULL Socket 测试程序 TestEcho-Pull
在 SocketHelper.h (.cpp) 中添加若干帮助结构体

最新版本:5
2023年7月上旬发布的 v5.9.2 主要更新有:
HTTP Cookie 请求和响应头‘Cookie’、‘Set-Cookie’支持不区分大小写
更好支持 GCC 11 编译器
openssl 升级到 1.1.1u 版本
mimalloc 升级到 1.8.2 版本

最新版本:6
v6.0.8于2026年2月中旬更新,主要更新亮点如下:
优化 Linux 通信组件多路复用处理架构,避免 “惊群” 问题,提升性能。
自动为 HP-Socket 工作线程设置唯一线程名称,方便跟踪调试。
TCP Client/Agent 以同步方式连接服务端时,支持通过 SetSyncConnectTimeout() 设置连接超时时间。
TcpServer/UdpServer/UdpNode 支持通过 SetDualStack () 方法设置是否支持 IPv4/IPv6 双协议栈。
客户端组件(Client/Agent)手工绑定本地地址的情况下,会根据连接的远程地址自动绑定本地的 IPv4 或 IPv6 地址。
支持定时回收垃圾内存和被动回收垃圾内存(默认使用定时回收,回收间隔 15 秒)。
修复 HTTP 组件 keep-alive 属性值丢失问题
Windows 版本支持在没有安装 MFC 的环境下编译。

第三方库更新:
brotli 升级到 1.2.0 版本
openssl 升级到 3.0.19 版本
mimalloc 升级到 2.2.7 版本


开发文档:https://www.docin.com/p-4062394468.html
下载地址:https://github.com/ldcsaa/HP-Socket