HP-Socket 是一套通用的高性能 TCP/UDP/HTTP 通信框架,包含服务端组件、客户端组件和Agent组件,广泛适用于各种不同应用场景的 TCP/UDP/HTTP 通信系统,提供 C/C++、C#、Delphi、E(易语言)、Java、Python 等编程语言接口。
HP-Socket 对通信层完全封装, 应用程序不必关注通信层的任何细节; HP-Socket提供基于事件通知模型的 API 接口,能非常简单高效地整合到新旧应用程序中。
总之HPSocket应用非常简单,性能非常强大,现在最新版本v5.8.1
github地址:https://github.com/ldcsaa/HP-Socket
下载zip包解压后,目录如下:
—DOC:目录下是官方提供的文档,包括Development Guide
—DotNet:.net项目的开发步骤,可以直接通过nuget部署HPsocket.net
—Linux:Linux的工程,包括android build
—MacOS:mac环境的开发步骤
—Windows:Windows的工程,最常用的开发环境
--Bin:编译好的dll和lib
--Demo:官方提供的使用示例,包括PUSH模型示例、 PULL模型示例、 PACK模型示例、 性能测试示例以及其它编程语言示例
--Project:项目的VS工程
--Include:使用HP-Socket库需要的头文件
--Src是核心功能源代码,Project只是工程,源代码在这里
--Common是通用功能源代码
--Other Languages 其他语言项目地址
目前支持Windows & Linux平台
一般在网络通信程序中,不得不提的就是Tcp,TCP属于传输层协议,使用范围非常广。
定义:传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。
一般tcp形式网络通信程序中都会有以下问题需要考虑:
1.收发缓冲区的设计
2.阻塞、非阻塞socket的选取
3.select/IOCP完成端口模型(win)
4.断包,粘包处理
5.心跳包设计
6.客户端短信重连
7.清除无效的死链
8.shutdown和优雅关闭
9.等等。。。
本篇我们主要讨论问题4断包、粘包在hp-socket中的处理过程。
由于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;
}
}
HP-Socket 提供 PUSH / PULL / PACK 等接收模型,应用程序可以灵活选择以手工方式、半自动方式或全自动方式处理封解包。
接收模型 | 接收事件 | 说明 |
---|---|---|
PUSH | OnReceive(pSender, dwConnID, pData, iLength) | 手工方式/原生方式,有接收到数据就触发 |
PULL | OnReceive(pSender, dwConnID, iLength) | 半自动,通过应用层协议配合,一起处理粘包 |
PACK | OnReceive(pSender, dwConnID, pData, iLength) | 全自动,组件内部处理的粘包pData一定是一个完整的数据包 |
通过以上分析,结合自己项目中通信协议,相信可以选择适合项目本身的接收模型。
本专栏一共分9篇,如下:
1.Hp-socket高性能网络库一--tcp组件push接收模型
2.Hp-socket高性能网络库二--tcp组件pull接收模型
3.Hp-socket高性能网络库三--tcp组件pack接收模型
4.Hp-socket高性能网络库四--ssl组件和运行环境
5.Hp-socket高性能网络库六--http组件和监听器事件
6.Hp-socket高性能网络库七--http组件Cookie管理
7.Hp-socket高性能网络库八--udp组件和参数配置
8.Hp-socket高性能网络库九--linux下编译和安装