框架详述
2.1 关键概念2.1.1 接收模型
如表 1.2-1 所示,HP-Socket 的 TCP 组件支持 PUSH、PULL 和 PACK 三种接收模型:
⚫ PUSH 模型:组件接收到数据时会触发监听器对象的 OnReceive(pSender, dwConnID,
pData, iLength) 事件,把数据“推”给应用程序。
⚫ PULL 模型:组件接收到数据时会触发监听器对象的 OnReceive(pSender, dwConnID,
iTotalLength) 事件,告诉应用程序当前已经接收到多少数据,应用程序检查数据的
长度,如果满足需要则调用组件的 Fetch(dwConnID, pData, iDataLength) 方法把需
要的数据“拉”出来。
⚫ PACK 模型:PACK 模型系列组件是 PUSH 和 PULL 模型的结合体,应用程序不
必处理分包(如:PUSH)与数据抓取(如:PULL),组件保证每个 OnReceive 事
件都向应用程序提供一个完整数据包。
三种模型的比较如图 2.1.1-1 所示:详细请查看官方文档查看细致解述
⚫ PUSH 模型组件触发监听器对象的 OnReceive(pSender, dwConnID, pData, iLength)
事件时,应用程序需要立即处理接收到的数据,如:粘包处理、协议解析等。组件
不会对应用层的数据处理工作提供任何协助。
⚫ PULL 模型组件触发监听器对象的 OnReceive(pSender, dwConnID, iTotalLength) 事
件时,应用程序根据应用层协议检测接收到的数据长度(iTotalLength)是否满足处
理条件,选择性地进行处理。当 iTotalLength 小于当前期望的长度时可以忽略本次
事 件 ; 当 iTotalLength 大 于 或 等 于 当 前 期 望 的 长 度 时 , 循 环 调 用 组 件 的
Fetch(dwConnID, pData, iDataLength) 方法把需要的数据拉取出来,直到剩余的数
据长度小于当前期望的长度。
Fetch(dwConnID, pData, iDataLength) 方法返回值的类型为 EnFetchR
⚫ PUSH 模型组件触发监听器对象的 OnReceive(pSender, dwConnID, pData, iLength)
事件时,应用程序需要立即处理接收到的数据,如:粘包处理、协议解析等。组件
不会对应用层的数据处理工作提供任何协助。
⚫ PULL 模型组件触发监听器对象的 OnReceive(pSender, dwConnID, iTotalLength) 事
件时,应用程序根据应用层协议检测接收到的数据长度(iTotalLength)是否满足处
理条件,选择性地进行处理。当 iTotalLength 小于当前期望的长度时可以忽略本次
事 件 ; 当 iTotalLength 大 于 或 等 于 当 前 期 望 的 长 度 时 , 循 环 调 用 组 件 的
Fetch(dwConnID, pData, iDataLength) 方法把需要的数据拉取出来,直到剩余的数
据长度小于当前期望的长度。
Fetch(dwConnID, pData, iDataLength) 方法返回值的类型为 EnFetchResult:
✓ FR_OK :成功拉取
✓ HR_LENGTH_TOO_LONG :拉取的长度超过实际数据长度
✓ HR_DATA_NOT_FOUND :没有数据可拉取,可能连接已被关闭
注意:只有当 Fetch(dwConnID, pData, iDataLength)方法返回 FR_OK 时,数据才会被
拉取出来。另外,PULL 模型组件还提供 Peek(dwConnID, pData, iDataLength)方法用于窥
探接收缓冲区,该方法不会移除缓冲区数据。
PULL 模型适用于完全清楚应用层协议,并且应用层协议可以根据当前数据包得知下一
个数据包长度的场景。典型的场景如 Head + Body,Head 长度固定,第一个数据包为 Head,
通过 Head 得知 Body 的长度,接收完 Body 之后下一个数据包一定为 Head。
注意:通过 PULL 模型与应用层协议的相互配合,使得应用程序可以免除粘包处理和
分拆包工作,从而减少应用程序的负担。
⚫ PACK 模型组件触发监听器对象的 OnReceive(pSender, dwConnID, pData, iLength)
事件时,会保证 pData 是一个完整的数据包。PACK 模型组件会对应用程序发送的
每个数据包自动加上 4 字节(32 位)的包头,组件接收到数据时根据包头信息自
动分包,每个完整数据包通过 OnReceive 事件发送给应用程序。
PACK包头格式:
XXXXXXXXXXYYYYYYYYYYYYYYYYYYYYYY
前 10 位 X 为包头标识位,用于数据包校验。有效包头标识取值范围 0 ~ 1023(0x3FF),
当包头标识等于 0 时不校验包头。后 22 位 Y 为长度位,记录包体长度。有效数据包最大
长度不能超过 4194303(0x3FFFFF)字节,默认长度限制为:262144(0x40000)字节。应
用程序可以通过 SetPackHeaderFlag() 和 SetMaxPackSize() 分别设置包头标识与最大包长限
制。
页:
[1]