`
guaishou
  • 浏览: 165632 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

【圣诞呈献】高性能 Socket 组件 HP-Socket v3.1.2 正式发布

    博客分类:
  • C++
阅读更多

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.2 更新 ***

 > 修改 Server 组件的 OnClose() / OnError() 事件的触发规则:

-----------------
  1. 以前版本的 TCP/UDP Server 组件中,当关闭一个连接时可能会同时触发一个 OnClose() 事件和若干个 OnError() 事件
  2. 由于存在上述可能性,所以应用程序需要对 OnClose() / OnError() 的处理事件代码段进行同步
  3. 从 v3.1.2 开始,当多个 OnClose() / OnError() 事件同时发生时,组件只会向应用程序通知第一个事件,后续事件则忽略
  4. 因此,应用程序在处理 OnClose() / OnError() 事件时不必处理同步,减少了出错的可能和编写同步及检测代码的负担
  5. 示例代码

    /* 示例代码一:*/
    /*----------------------------------------------------------------------------*/
    ISocketListener::EnHandleResult CServerDlg::OnClose(CONNID dwConnID)
    {
    	// 以前版本:有可能存在并发的 OnClose()/OnError(),要把代码放在临界区中并检测返回值
    
    	CCriSecLock locallock(m_csPkgInfo);	// <-- 临界区
    
    	PVOID pInfo = nullptr;
    	// <-- 检测返回值
    	if(m_Server->GetConnectionExtra(dwConnID, &pInfo) && pInfo != nullptr)
    	{
    		m_Server->SetConnectionExtra(dwConnID, nullptr);
    		delete pInfo;
    	}
    }
    
    /* 示例代码二:*/
    /*----------------------------------------------------------------------------*/
    ISocketListener::EnHandleResult CServerDlg::OnClose(CONNID dwConnID)
    {
    	// v3.1.2 版本:只会接收到一个 OnClose()/OnError() 事件,能安全地移除临界区代码和检测代码
    
    	PVOID pInfo = nullptr;
    	m_Server->GetConnectionExtra(dwConnID, &pInfo);
    	ASSERT(pInfo != nullptr);
    
    	delete pInfo;
    }

> 其它更新:

-----------------
  1. 调整 TCP Server 默认参数
     
    1) DEFAULT_SOCKET_LISTEN_QUEUE	: 300
    2) DEFAULT_ACCEPT_SOCKET_COUNT	: 300
    3) DEFAULT_FREE_SOCKETOBJ_POOL	: 150
    4) DEFAULT_FREE_SOCKETOBJ_HOLD	: 450
    5) DEFAULT_FREE_BUFFEROBJ_POOL	: 300
    6) DEFAULT_FREE_BUFFEROBJ_HOLD	: 900
     
  2. 调整 UDP Server 默认参数
     
    1) DEFAULT_FREE_SOCKETOBJ_POOL	: 150
    2) DEFAULT_FREE_SOCKETOBJ_HOLD	: 450
    3) DEFAULT_FREE_BUFFEROBJ_POOL	: 300
    4) DEFAULT_FREE_BUFFEROBJ_HOLD	: 900

> 升级说明:

-----------------
  1. 使用 HP-Socket v3.1.1 及以前版本的应用程序可以安全升级到 HP-Socket v3.1.2

*** 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 缓冲区

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

5
7
分享到:
评论

相关推荐

    含两个文件hive-jdbc-3.1.2-standalone.jar和apache-hive-3.1.2-bin.tar.gz

    含两个文件hive-jdbc-3.1.2-standalone.jar和apache-hive-3.1.2-bin.tar.gz 含两个文件hive-jdbc-3.1.2-standalone.jar和apache-hive-3.1.2-bin.tar.gz 含两个文件hive-jdbc-3.1.2-standalone.jar和apache-hive-...

    CaptfEncoder-win-x64-3.1.2

    编码解码工具

    hp-socket-3.1.2.zip_HP-Socket_hP-Socket server_hp iocp_iocp hp_i

    《HP-Socket 3.1.2:基于iOCP的高性能通信服务器及客户端组件解析》 HP-Socket 3.1.2是一款专为Windows平台设计的高性能网络通信库,其核心特性在于利用了微软的I/O完成端口(I/O Completion Port, iOCP)技术来...

    sipp-win32-3.1.2-ossl

    【标题】"sipp-win32-3.1.2-ossl" 是一个专...在实际应用中,SIPp-win32-3.1.2-ossl可以帮助VoIP服务提供商、网络设备制造商以及软件开发者全面地测试其SIP解决方案,确保它们在高负载下的正常运行,并且符合安全标准。

    flink-sql-connector-hive-3.1.2_2.11-1.11.6.jar 已经解决guava冲突亲测可以

    flink-sql-connector-hive-3.1.2_2.11-1.11.6.jar 已经解决guava冲突亲测可以

    hadoop-eclipse-plugin-3.1.2.jar

    在eclipse中搭建hadoop环境,需要安装hadoop-eclipse-pulgin的插件,根据hadoop的版本对应jar包的版本,此为hadoop3.1.2版本的插件。

    hive-jdbc-3.1.2-standalone

    hive-jdbc-3.1.2-standalone适用于linux

    flink-sql-connector-hive-3.1.2_2.12-1.12.0.jar flink整合hive3资源包

    由于jar包的下载速度很慢,我想也有很多下载慢的同学,分享下

    hive-jdbc-3.1.2.jar

    jdbc连接hive所需的一个包 ( hive-jdbc-3.1.2.jar)

    hive-jdbc-uber-3.1.2+yanagishima-18.0

    《Hive JDBC Uber 3.1.2与Yanagishima:Kerberos环境下的即席查询解决方案》 在大数据处理领域,Apache Hive作为一款强大的数据仓库工具,被广泛用于存储、管理和分析大规模结构化数据。而Hive JDBC是连接Hive与...

    jbpm-starters-kit-3.1.2.part2.rar

    jbpm-starters-kit-3.1.2插件,jbpm-starters-kit-3.1.2插件,jbpm-starters-kit-3.1.2插件,jbpm-starters-kit-3.1.2插件,jbpm-starters-kit-3.1.2插件,jbpm-starters-kit-3.1.2插件,共两卷

    apache-hive-3.1.2-bin.tar.gz

    从压缩包子文件的文件名称列表"apache-hive-3.1.2-bin"来看,这个目录很可能包含了以下关键组件: 1. `bin/`:包含Hive的可执行脚本,如`hive`命令行客户端和`hiveserver2`服务。 2. `lib/`:存放Hive依赖的各种JAR...

    hive-exec-3.1.2.jar

    guava-27.0-jre.jar 编译的hive-exec-3.1.2.jar

    hive-jdbc-3.1.2-standalone.jar

    Hive连接的jar包——hive-jdbc-3.1.2-standalone.jar,使用数据库连接软件连接数据仓库时需要使用相应的驱动器驱动,希望对大家有所帮助

    apache-hive-3.1.2-bin.tar.gz.zip

    apache-hive-3.1.2-bin.tar.gz, 下载自:https://mirrors.bfsu.edu.cn/apache/hive/hive-3.1.2/, 上传至CSDN备份,本资源下载后需要解压缩zip文件,才是原本的apache-hive-3.1.2-bin.tar.gz文件

    6ES7518-4AP00-0AB0-CPU1518 V3.1.2固件.txt

    从提供的信息中可以看出,您所要求生成的知识点是关于“6ES7518-4AP00-0AB0-CPU1518 V3.1.2固件”的详细说明。请注意,由于所给文件内容除了文件名和一个网络链接外,并没有具体的内容,因此以下内容基于我对固件和...

    metrics-core-3.1.2-API文档-中文版.zip

    赠送jar包:metrics-core-3.1.2.jar; 赠送原API文档:metrics-core-3.1.2-javadoc.jar; 赠送源代码:metrics-core-3.1.2-sources.jar; 赠送Maven依赖信息文件:metrics-core-3.1.2.pom; 包含翻译后的API文档:...

    hive-spark-client-3.1.2.jar

    hive-on-spark客户端

    rt-thread-3.1.2.zip

    RT-Thread v3.1.2是该系统的一个版本,旨在提供高性能、低功耗和易用性的特性,适用于各种嵌入式平台。这个压缩包“rt-thread-3.1.2.zip”包含了RT-Thread的源代码,允许开发者深入理解其工作原理,并根据项目需求...

    spring-framework-3.1.2.RELEASE jar包

    总的来说,`spring-framework-3.1.2.RELEASE.jar`包含了Spring框架的核心组件和服务,为开发者提供了强大的工具来构建高质量、可扩展的应用程序。尽管这个版本已经有些过时,但其稳定性、成熟性和广泛的应用表明,...

Global site tag (gtag.js) - Google Analytics