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 eventsvirtual 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 objectCListenerImpl s_listener;// 2. Create component object (and binding with listener object)CTcpPullServerPtr s_pserver(&s_listener);// 3. Start component objectif(!s_pserver->Start("0.0.0.0", 5555))exit(1);/* wait for exit */// ... ... // 6. (optional) Stop component objects_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 eventsvirtual 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开头)具体的使用方法在开头做了说明

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>

HP-Socket 官方例程解析相关推荐

  1. 一天上手Aurora 8B/10B IP核(4)----从Streaming接口的官方例程学起

    Xilinx的技术生态做的非常好,基本上所有常用的IP核都有官方例程(example design)供开发者学习,咱不用白不用,今儿咱就一起白嫖他一手----从官方例程开始学习如何具体使用这个IP核. ...

  2. 一天上手Aurora 8B/10B IP核(5)----从Framing接口的官方例程学起

    文章目录 写在前面 1.IP核定制与官方例程的生成 1.1.第一页配置:物理层以及链路层信息选择 1.2.第二页配置:对应GT收发器的物理位置选择 1.3.第三页配置:共享逻辑的位置 1.4.官方例程 ...

  3. 【Netty】入门Netty官方例子解析(二)Time Server

    本文承接上文<[Netty]入门Netty官方例子解析(一)写个 Discard Server> ,接下来讲解官网文档中Netty入门官方例子第二个例子 Time Server 原文这个章 ...

  4. 虚幻4 游戏引擎 C++编程 官网例程解析

    虚幻4游戏引擎C++编程官网例程解析 官网例程 源代码 FloatingActor.h FloatingActor.cpp 内容说明 pragma once 头文件 UClass宏 AActor类 P ...

  5. 【OAI】部署5GSA独立组网网络切片例程及例程解析

    文章目录 摘要 引言 关键技术介绍 5G核心网 核心网网元功能 网络切片 OAI Docker 官方例程详解 整体介绍 具体详解 网络切片架构 部署概览与说明 1-4 1.预先准备 5.部署OAI 5 ...

  6. DPDK官方例程分析(4)-flow_classify

    前言 Flow Classify示例应用程序基于转发应用程序的简单框架示例. 它旨在演示使用Flow Classify库API的DPDK转发应用程序的基本组件 flow_classify例子对于DPD ...

  7. ESP32——WebSocket Echo Server官方例程分析和测试

    1  简介 开发板为ESP32-DevKitC 程序为官方示例:esp-idf\examples\protocols\http_server\ws_echo_server 创建方法参照:ESP32-- ...

  8. harmonyos能否移植到MCU,HarmonyOS(LiteOs_m) 官方例程移植到STM32初体验

    HarmonyOS(LiteOs_m) 官方例程移植到STM32初体验 硬件平台 基于正点原子战舰V3开发板 MCU:STM32F103ZET6 片上SRAM大小:64KBytes 片上FLASH大小 ...

  9. AXI-IIC官方示例解析

    AXI-IIC官方示例解析 说明:本文是作者自己对Xilinx的AXI-IIC的官方示例的解析,如有错误望各位指正. 文章目录 AXI-IIC官方示例解析 前言 xiic_eeprom_example ...

最新文章

  1. 下一代 Service Mesh -- istio 架构分析
  2. Android中获取系统内存信息以及进程信息-----ActivityManager的使用(一)
  3. showModalDialog 页面上GridView的分页问题
  4. Azkaban启动与激活命令
  5. Intellij Idea上传本地项目到Git
  6. 列运算_Power Query列运算的几种方法比较
  7. 除了中国,原来还有这么多国家采用十二生肖的啊~| 今日最佳
  8. Hbase Rowkey设计原则
  9. php 服务器安装,php服务器安装笔记
  10. 使用wordpress分页函数paginate_links
  11. 单臂路由实现VLAN间通信
  12. 全国计算机演示文稿,全国计算机统考押题——演示文稿
  13. Unity 实用小技巧(更新ing)
  14. TOM企业邮箱,2021“重心出发”,聚焦企业邮箱安全办公!
  15. js 解二元一次方程组(消元法)
  16. 图片拼图微信小程序源码_支持多模板制作和流量主
  17. ENVI 5.3 操作Landset8遥感影像预处理问题汇总(1)
  18. 魔王语言解释 C++
  19. 导图解文 从梦想到财富(28)如何成为顶尖高手
  20. 关于ldo的纹波抑制比

热门文章

  1. Linux网络编程之System V消息队列
  2. 开手机私服,服务器配置参考事项
  3. (林大oj1276)
  4. PB编辑器里怎么查看代码行数
  5. Linux Debian: 命令行连接 wifi 配置,解决在DELL戴尔和Thinkpad联想上Wicd找不到无线网问题 (用 ifup 或 nmcli )
  6. 关于“校外”小饭桌就餐安全致全区学生家长的一封信
  7. 《Java SE实战指南》22-04:字节流和字符流
  8. 亿级以上的数据量 ES如何优化
  9. php爬虫抓取信息及反爬虫相关
  10. QT 串口通信,操作程控电源 Agilent 66312A