当前位置:   article > 正文

HP-Socket 官方例程解析_hpsocket源代码分析

hpsocket源代码分析

 

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. 销毁监听器
  1. 示例代码
  2. #include <hpsocket/HPSocket.h>
  3. /* Listener Class */
  4. class CListenerImpl : public CTcpPullServerListener
  5. {
  6. public:
  7. // 5. process network events
  8. virtual EnHandleResult OnPrepareListen(ITcpServer* pSender, SOCKET soListen);
  9. virtual EnHandleResult OnAccept(ITcpServer* pSender, CONNID dwConnID, UINT_PTR soClient);
  10. virtual EnHandleResult OnHandShake(ITcpServer* pSender, CONNID dwConnID);
  11. virtual EnHandleResult OnReceive(ITcpServer* pSender, CONNID dwConnID, int iLength);
  12. virtual EnHandleResult OnSend(ITcpServer* pSender, CONNID dwConnID, const BYTE* pData, int iLength);
  13. virtual EnHandleResult OnClose(ITcpServer* pSender, CONNID dwConnID, EnSocketOperation enOperation, int iErrorCode);
  14. virtual EnHandleResult OnShutdown(ITcpServer* pSender);
  15. };
  16. int main(int argc, char* const argv[])
  17. {
  18. // 1. Create listener object
  19. CListenerImpl s_listener;
  20. // 2. Create component object (and binding with listener object)
  21. CTcpPullServerPtr s_pserver(&s_listener);
  22. // 3. Start component object
  23. if(!s_pserver->Start("0.0.0.0", 5555))
  24. exit(1);
  25. /* wait for exit */
  26. // ... ...
  27. // 6. (optional) Stop component object
  28. s_pserver->Stop();
  29. return 0;
  30. // 7. Destroy component object automatically
  31. // 8. Destroy listener object automatically
  32. }

这里首先是两点

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

关于 CListenerImpl

  1. class CListenerImpl : public CTcpPullServerListener
  2. {
  3. public:
  4. // 5. process network events
  5. virtual EnHandleResult OnPrepareListen(ITcpServer* pSender, SOCKET soListen);
  6. virtual EnHandleResult OnAccept(ITcpServer* pSender, CONNID dwConnID, UINT_PTR soClient);
  7. virtual EnHandleResult OnHandShake(ITcpServer* pSender, CONNID dwConnID);
  8. virtual EnHandleResult OnReceive(ITcpServer* pSender, CONNID dwConnID, int iLength);
  9. virtual EnHandleResult OnSend(ITcpServer* pSender, CONNID dwConnID, const BYTE* pData, int iLength);
  10. virtual EnHandleResult OnClose(ITcpServer* pSender, CONNID dwConnID, EnSocketOperation enOperation, int iErrorCode);
  11. virtual EnHandleResult OnShutdown(ITcpServer* pSender);
  12. };

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

  1. 在 Socketinterface.h 中
  2. /************************************************************************
  3. 名称:PUSH 模型服务端 Socket 监听器抽象基类
  4. 描述:定义某些事件的默认处理方法(忽略事件)
  5. ************************************************************************/
  6. class CTcpServerListener : public ITcpServerListener
  7. /************************************************************************
  8. 名称:PULL 模型服务端 Socket 监听器抽象基类
  9. 描述:定义某些事件的默认处理方法(忽略事件)
  10. ************************************************************************/
  11. class CTcpPullServerListener : public CTcpServerListener

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

关于 CTcpPullServerPtr

同样我们可以跟踪到

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

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

  1. Usage:
  2. 方法一:
  3. --------------------------------------------------------------------------------------
  4. 0. 应用程序包含 HPTypeDef.h / SocketInterface.h / HPSocket.h 头文件
  5. 1. 调用 HP_Create_Xxx() 函数创建 HPSocket 对象
  6. 2. 使用完毕后调用 HP_Destroy_Xxx() 函数销毁 HPSocket 对象
  7. 方法二:
  8. --------------------------------------------------------------------------------------
  9. 0. 应用程序包含 SocketInterface.h 和 HPSocket.h 头文件
  10. 1. 创建 CXxxPtr 智能指针,通过智能指针使用 HPSocket 对象
  11. Release:
  12. <-- 动态链接库 -->
  13. 1. x86/libhpsocket.so - (32/MBCS/Release)
  14. 2. x86/libhpsocket_d.so - (32/MBCS/DeBug)
  15. 3. x64/libhpsocket.so - (64/MBCS/Release)
  16. 4. x64/libhpsocket_d.so - (64/MBCS/DeBug)
  17. <-- 静态链接库 -->
  18. 1. x86/static/libhpsocket.a - (32/MBCS/Release)
  19. 2. x86/static/libhpsocket_d.a - (32/MBCS/DeBug)
  20. 3. x64/static/libhpsocket.a - (64/MBCS/Release)
  21. 4. x64/static/libhpsocket_d.a - (64/MBCS/DeBug)

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

  1. 1、PUSH 模型:组件接收到数据时会触发监听器对象的 OnReceive(pSender, dwConnID,pData, iLength) 事件,把数据“推”给应用程序。
  2. 2、 PULL 模型: 组件接收到数据时会触发监听器对象的 OnReceive(pSender, dwConnID,iTotalLength) 事件,告诉应用程序当前已经接收到多少数据,应用程序检查数据的长度,如果满足需要则调用组件的 Fetch(dwConnID, pData, iDataLength) 方法把需要的数据“拉”出来。
  3. 3、 PACK 模型: PACK 模型系列组件是 PUSH 和 PULL 模型的结合体,应用程序不必处理分包(如: PUSH)与数据抓取(如: PULL), 组件保证每个 OnReceive 事件都向应用程序提供一个完整数据包。

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

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

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

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

总结

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

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

  1. virtual EnHandleResult OnReceive
  2. (ITcpServer* pSender, CONNID dwConnID, const BYTE* pData, int iLength) override
  3. {
  4. printf("OnReceive\n");
  5. if(pSender->Send(dwConnID, pData, iLength))
  6. return HR_OK;
  7. return HR_ERROR;
  8. }
  9. /***********************************/
  10. EnHandleResult OnReceive
  11. (ITcpServer* pSender, CONNID dwConnID, const BYTE* pData, int iLength)
  12. 中的 ITcpServer* pSender 进行
  13. pSender->Send(dwConnID, pData, iLength) 将数据发送出去

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

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/507156
推荐阅读
相关标签
  

闽ICP备14008679号