HP-Socket 官方例程解析

 

HP-Socket 官方库项目的地址
ldcsaa/HP-Socket: High Performance TCP/UDP/HTTP Communication Component
https://github.com/ldcsaa/HP-Socket

环境:ubuntu
本文基于其readme中的C++程序来做分析
git中提供的《HP-Socket网络通信框架开发指南》还是需要反复好好看的


工作流程

  1. 创建监听器
  2. 创建通信组件(同时绑定监听器)
  3. 启动通信组件
  4. 连接到目标主机(Agent组件)
  5. 处理通信事件(OnConnect/OnReceive/OnClose等)
  6. 停止通信组件(可选:在第7步销毁通信组件时会自动停止组件)
  7. 销毁通信组件
  8. 销毁监听器
示例代码
#include <hpsocket/HPSocket.h>

/* Listener Class */
class CListenerImpl : public CTcpPullServerListener
{
public:
	// 5. process network events
	virtual EnHandleResult OnPrepareListen(ITcpServer* pSender, SOCKET soListen);
	virtual EnHandleResult OnAccept(ITcpServer* pSender, CONNID dwConnID, UINT_PTR soClient);
	virtual EnHandleResult OnHandShake(ITcpServer* pSender, CONNID dwConnID);
	virtual EnHandleResult OnReceive(ITcpServer* pSender, CONNID dwConnID, int iLength);
	virtual EnHandleResult OnSend(ITcpServer* pSender, CONNID dwConnID, const BYTE* pData, int iLength);
	virtual EnHandleResult OnClose(ITcpServer* pSender, CONNID dwConnID, EnSocketOperation enOperation, int iErrorCode);
	virtual EnHandleResult OnShutdown(ITcpServer* pSender);
};

int main(int argc, char* const argv[])
{
	// 1. Create listener object
	CListenerImpl s_listener;
	
	// 2. Create component object (and binding with listener object)
	CTcpPullServerPtr s_pserver(&s_listener);
	
	// 3. Start component object
	if(!s_pserver->Start("0.0.0.0", 5555))
		exit(1);
	
	/* wait for exit */
	// ... ... 
		
	// 6. (optional) Stop component object
	s_pserver->Stop();

	return 0;
	
	// 7. Destroy component object automatically
	// 8. Destroy listener object automatically
}

这里首先是两点

  1. 创建监听器 CListenerImpl s_listener;
  2. 创建通信组件(同时绑定监听器) CTcpPullServerPtr s_pserver(&s_listener);
    后续的通信的启动、配置等功能,均是通过 s_pserver 来进行的

关于 CListenerImpl

class CListenerImpl : public CTcpPullServerListener
{
public:
	// 5. process network events
	virtual EnHandleResult OnPrepareListen(ITcpServer* pSender, SOCKET soListen);
	virtual EnHandleResult OnAccept(ITcpServer* pSender, CONNID dwConnID, UINT_PTR soClient);
	virtual EnHandleResult OnHandShake(ITcpServer* pSender, CONNID dwConnID);
	virtual EnHandleResult OnReceive(ITcpServer* pSender, CONNID dwConnID, int iLength);
	virtual EnHandleResult OnSend(ITcpServer* pSender, CONNID dwConnID, const BYTE* pData, int iLength);
	virtual EnHandleResult OnClose(ITcpServer* pSender, CONNID dwConnID, EnSocketOperation enOperation, int iErrorCode);
	virtual EnHandleResult OnShutdown(ITcpServer* pSender);
};

1)其中OnPrepareListen等方法,需要自己去具体实现,他们分别会在各自OnXXXX的情况下触发
2)关于基类 CTcpPullServerListener

在 Socketinterface.h 中
/************************************************************************
名称:PUSH 模型服务端 Socket 监听器抽象基类
描述:定义某些事件的默认处理方法(忽略事件)
************************************************************************/
class CTcpServerListener : public ITcpServerListener


/************************************************************************
名称:PULL 模型服务端 Socket 监听器抽象基类
描述:定义某些事件的默认处理方法(忽略事件)
************************************************************************/
class CTcpPullServerListener : public CTcpServerListener

逐级向上,此处可以结合pdf中 Server组件接口去看
在这里插入图片描述
在这里插入图片描述

关于 CTcpPullServerPtr

同样我们可以跟踪到

在HPSocket.h中
typedef CHPSocketPtr<ITcpPullServer, ITcpServerListener, TcpPullServer_Creator>	CTcpPullServerPtr;

其实此处有很多类似的
HPSocket.h
这里我们就会了解到,其实(在HPSocket。h开头)具体的使用方法在开头做了说明

Usage:
		方法一:
		--------------------------------------------------------------------------------------
		0. 应用程序包含 HPTypeDef.h / SocketInterface.h / HPSocket.h 头文件
		1. 调用 HP_Create_Xxx() 函数创建 HPSocket 对象
		2. 使用完毕后调用 HP_Destroy_Xxx() 函数销毁 HPSocket 对象

		方法二:
		--------------------------------------------------------------------------------------
		0. 应用程序包含 SocketInterface.h 和 HPSocket.h 头文件
		1. 创建 CXxxPtr 智能指针,通过智能指针使用 HPSocket 对象

Release:
		<-- 动态链接库 -->
		1. x86/libhpsocket.so			- (32位/MBCS/Release)
		2. x86/libhpsocket_d.so			- (32位/MBCS/DeBug)
		3. x64/libhpsocket.so			- (64位/MBCS/Release)
		4. x64/libhpsocket_d.so			- (64位/MBCS/DeBug)

		<-- 静态链接库 -->
		1. x86/static/libhpsocket.a		- (32位/MBCS/Release)
		2. x86/static/libhpsocket_d.a	- (32位/MBCS/DeBug)
		3. x64/static/libhpsocket.a		- (64位/MBCS/Release)
		4. x64/static/libhpsocket_d.a	- (64位/MBCS/DeBug)

这里使用的是方法二,也就是CXxxPtr 智能指针。
HP-Socket 的 TCP 组件支持 PUSH、 PULL 和 PACK 三种接收模型

1、PUSH 模型:组件接收到数据时会触发监听器对象的 OnReceive(pSender, dwConnID,pData, iLength) 事件,把数据“推”给应用程序。

2、 PULL 模型: 组件接收到数据时会触发监听器对象的 OnReceive(pSender, dwConnID,iTotalLength) 事件,告诉应用程序当前已经接收到多少数据,应用程序检查数据的长度,如果满足需要则调用组件的 Fetch(dwConnID, pData, iDataLength) 方法把需要的数据“拉”出来。

3、 PACK 模型: PACK 模型系列组件是 PUSH 和 PULL 模型的结合体,应用程序不必处理分包(如: PUSH)与数据抓取(如: PULL), 组件保证每个 OnReceive 事件都向应用程序提供一个完整数据包。

对于CXxxPtr 智能指针的使用,以CTcpServerPtr为例,我们可以看到有如下方法

typedef CHPSocketPtr<ITcpServer, ITcpServerListener, TcpServer_Creator>  CTcpServerPtr;
下面考察主要的  ITcpServer 

在这里插入图片描述在这里插入图片描述
所以其实对于通信socket的启动关闭设置等功能均可以在此处进行

回顾下上面的示例代码
s_pserver->Start("0.0.0.0", 5555)
s_pserver->Stop();

总结

从简单的使用来说,3个环节
1、创建监听器, 创建通信组件(同时绑定监听器)

2、填充OnXXXX等函数,比如OnReceive就打印出来,或者调用

virtual EnHandleResult OnReceive
(ITcpServer* pSender, CONNID dwConnID, const BYTE* pData, int iLength) override
	{
		printf("OnReceive\n"); 
		if(pSender->Send(dwConnID, pData, iLength))
			return HR_OK;		
		return HR_ERROR;
	}

/***********************************/
EnHandleResult OnReceive
(ITcpServer* pSender, CONNID dwConnID, const BYTE* pData, int iLength)
中的 ITcpServer* pSender 进行
pSender->Send(dwConnID, pData, iLength)   将数据发送出去

3、主程序中,使用 CXxxPtr 智能指针进行基本的设置、启动、关闭等动作

ps
可以在主程序return前,执行while1,这样程序会一直停留准备进行响应

pps
1)使用g++编译时,需要添加选项 -std=c++11
2)如果出现编译时候一些基本类型有问题, 建议添加 #include <cstdlib>

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
v4.3.1 更新: > HTTP: 1、IHttpClient 和 IHttpAgent 组件兼容没有长度标识(如:Content-Length Header)的 HTTP 响应报文 2、IHttpClient 和 IHttpAgent 组件改进 HEAD 请求的响应处理方式,应用程序无需在 OnHeadersComplete 事件中返回特殊值 HPR_SKIP_BODY > 其它更新: 1、公共代码包 vc-common-src 版本升级到 v2.3.19 2、OpenSSL 版本升级到 1.1.0f 3、优化 IServer/IAgent 组件,提升性能和稳定性 > 升级说明: 1、HP-Socket v4.3.1 完全兼容 HP-Socket v4.2.1 版本,可以直接替换升级 v4.2.1 更新: > HTTP Cookie 管理: 1、新增 Cookie 管理器,可在不同连接、不同组件对象间共享 Cookie 2、Cookie 管理器实现了标准 HTTP Cookie 功能,支持 Max-Age、expires、httpOnly、secure 3、Cookie 管理器支持 Cookie 序列化与反序列化 4、IHttpClient 和 IHttpAgent 组件可通过 SetUseCookie() 方法设置是否开启 Cookie 功能 > HTTP Sync Client 通信组件: 1、Create_HP_HttpSyncClient 和 Create_HP_HttpsSyncClient 方法增加可选参数 pListener 2、如果 pListener 非空则可以通过 pListener 监听 HttpSyncClient 的所有通信事件 > 其它更新: 1、Demo 更新:HttpProxy,TestEcho-Http,TestEcho-Http-4C 2、公共代码包 vc-common-src 版本升级到 v2.3.18 3、OpenSSL 版本升级到 1.1.0e > 升级说明: 1、HTTP Sync Client 组件:需要调整 Create_HP_HttpSyncClient 和 Create_HP_HttpsSyncClient 的调用参数 2、其他组件:HP-Socket v4.2.1 完全兼容 HP-Socket v4.1.x 版本,可以直接替换升级 v4.1.3 更新: > 代码调整: 1、修正 ITcpServer 和 ITcpAgent 组件的 Onclose 事件在 SP_DIRECT 发送模式下的触发规则 2、IClient 组件优化,提高稳定性 > 升级说明: 1、HP-Socket v4.1.3 完全兼容 HP-Socket v4.1.2 版本,可以直接替换升级 v4.1.2 更新: > 代码调整: 1、采用新环形缓冲区算法提高异步操作安全性 2、采用延时释放策略提高 HTTP 异步操作安全性 > 升级说明: 1、HP-Socket v4.1.2 完全兼容 HP-Socket v4.1.1 版本,可以直接替换升级 v4.1.1 更新: > WebSocket 支持: 1、所有 HTTP 组件增加 WebSocket 方法: 1) SendWSMessage(): 发送 WebSocket 数据包 2) GetWSMessageState(): 获取当前 WebSocket 状态 2、所有 HTTP 组件监听器增加 WebSocket 事件: 1) OnWSMessageHeader(): WebSocket 数据包头通知 2) OnWSMessageBody(): WebSocket 数据包体通知 3) OnWSMessageComplete(): WebSocket 数据包完成通知 3、示例 Demo TestEcho-Http 和 TestEcho-Http-4C 支持 WebSocket > 增加 HTTP Sync Client 通信组件: 1、HTTP Sync Client 实现同步 HTTP 通信,不需要事件监听器 2、HTTP Sync Client 组件类: CHttpSyncClient、CHttpsSyncClient 3、HTTP Sync Client 实现接口: ITcpClient / IHttpSyncRequester 4、示例 Demo TestEcho-Http 和 TestEcho-Http-4C 提供 HTTP Sync Client 示例 > 升级说明: 1、HP-Socket v4.1.1 完全兼容 HP-Socket v4.0.1 版本,可以直接替换升级 v4.0.1 更新: > 增加 HTTP 系列通信组件: 1、新增 HTT

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值