HPSocket 三种模型PACK,PUSH,PULL

更多信息请参看HP-Socket网络通信框架开发指南v5.2-20180201(https://download.csdn.net/download/cair2/10636514)
由于TCP是流式套接字,所以socket收到的数据而言,可能不是一个完整的包或者粘包了。此时需要应用层来进行拆包组包了。例如客户端连续发送了三个数据包大小分别是:300,500,100。但是接收端接受到的数据可能是200,400,100,200。所以此时我们处理接收到的数据就要进行组包和拆包了。
由于200不足一个数据包,所以需要组合下一个数据包400。此时数据大小为600,但是客户端第一个发送的数据包是300,所以此时需要将600拆分为300+300。此时就可以得到第一个数据包300,剩余数据300,但是第二个数据包是500。数据不够所以需要组合下一个数据100总共数据400,依然不够一个包,继续组包剩余的200,此时接受数据600,足够一个数据包500,所以将600拆解为500+100。得到第二个数据包500,剩余数据100,正好和第三个数据包100匹配。此时数据包解析完毕。基本逻辑

while(true)
{
	data_size = recv_data();
	if(data_size < 数据包长度)
		continue;//继续接受数据
	
	///循环拆包,当不够一个包的时候继续接受数据等待一个完整的包
	while(true)
	{
		//足够包长度,拆包
		data_size -= 数据包长度;
		//更新数据缓冲区,处理包
		hanle_pack(pack);
		if(data_size < 数据包长度)
			break;
	}
}

所以综上所述模型:
PUSH:收到数据立马触发OnReceive,由开发人员自己实现拆包和缓冲区的管理逻辑。
PULL:收到数据立马触发OnReceive,但需要开发人员维护数据包的长度(数据缓冲区管理HP内部做了),当拼接一个完整的Pack之后,Fetch获取完整的数据包就OK了。
PACK:收到数据并且拼成一个完整的Pack之后触发OnReceive,OnReceive的数据就是一个完整的包。开发人员不必关系拼包的过程,

  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
使用最新的 HP-Socket 库创建 UDP 服务器或客户端非常简单。下面是一个简单的示例: 首先,你需要在项目中添加 HP-Socket 库的头文件和库文件。在 Qt 中,你可以使用以下语句在 .pro 文件中添加库文件: ``` LIBS += -L/path/to/hpsocket/lib -lhpsocketx ``` 然后,在你的代码中,你需要包含 HP-Socket 的头文件: ```cpp #include "HPTypeDef.h" #include "HPNetFunc.h" #include "HPSocket4C.h" ``` 接下来,你需要创建一个 HP-Socket 对象: ```cpp HP_UdpServerListener listener = nullptr; HP_UdpServer pServer = Create_HP_UdpServer(listener); ``` 这将创建一个 UDP 服务器对象。你还需要设置服务器的属性,例如监听的 IP 地址和端口号: ```cpp pServer->SetReuseAddress(TRUE); pServer->SetMaxDatagramSize(4096); pServer->SetSendPolicy(SP_PACK); pServer->SetRecvPolicy(RP_SERIALIZE); pServer->SetFreeSocketObj(TRUE); pServer->SetWorkerThreadCount(0); pServer->Bind("0.0.0.0", 5555); ``` 接下来,你需要启动服务器: ```cpp pServer->Start(); ``` 现在,你已经创建了一个 UDP 服务器并启动了它。你可以使用以下代码发送数据: ```cpp HP_Address addr; pServer->GetRemoteAddress(&addr); pServer->SendPackets(&addr, pData, iLength); ``` 其中,pData 是要发送的数据指针,iLength 是数据长度。 对于 UDP 客户端,你可以使用以下代码创建一个 HP-Socket 对象: ```cpp HP_UdpClientListener listener = nullptr; HP_UdpClient pClient = Create_HP_UdpClient(listener); ``` 然后,设置客户端的属性并连接到服务器: ```cpp pClient->SetReuseAddress(TRUE); pClient->SetMaxDatagramSize(4096); pClient->SetSendPolicy(SP_PACK); pClient->SetRecvPolicy(RP_SERIALIZE); pClient->SetFreeSocketObj(TRUE); pClient->SetWorkerThreadCount(0); pClient->SetRemoteAddress("127.0.0.1", 5555); pClient->Connect(); ``` 现在,你已经创建了一个 UDP 客户端并连接到服务器。你可以使用以下代码发送数据: ```cpp pClient->SendPackets(pData, iLength); ``` 这应该能够让你使用最新的 HP-Socket 库创建 UDP 服务器或客户端。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值