数据分包处理
2011-07-08 09:52
381 查看
#ifndef __DIVPACK_H__ #define __DIVPACK_H__ #pragma once typedef int (*pfnProcessPackCallback)(const char*, int, void*); class TDivPack { public: TDivPack() { maxlen = 0; szpack = NULL; Reset(); } ~TDivPack() { if(szpack != NULL) { free(szpack); szpack = NULL; } } void Reset() { bunbroken=true; npacklen = 0; ncurlen = 0; nleftlen = 0; } void DivPack(const char* pbuf, int nsize, pfnProcessPackCallback ProcessCallback, void* pVoid) { if(nsize <= 0) return; if(!bunbroken) { // 当前包数据没有接收完全,继续处理接收 // 首先计算前一个包还需要多少数据 int nleft = npacklen - ncurlen; if(nleft > nsize) { // 如果当前包还能容纳的数据大于传入的数据,将数据附加到当前包尾 memcpy(szpack+ncurlen, pbuf, nsize); // 更新当前包的接收长度 ncurlen += nsize; } else { // 如果当前包还能容纳的数据小于或等于传入的数据,将数据附加到当前包尾 memcpy(szpack+ncurlen, pbuf, nleft); // 标记产生一个完整的包, 进行处理 if(ProcessCallback != NULL) { (*ProcessCallback)(szpack, npacklen, pVoid); } bunbroken = true; npacklen = 0; // 继续处理剩余数据 DivPack(pbuf+nleft, nsize - nleft, ProcessCallback, pVoid); } } else { // 重置当前包的数据标记 ncurlen = 0; bunbroken = true; if( nsize < (4-nleftlen) ) { // 如果当前传入的数据长度小于 解析包长度所需的字节数,保存数据 memcpy(((char*)&npacklen)+nleftlen, pbuf, 4-nleftlen); nleftlen += nsize; return; } // 解析数据包长度 memcpy(((char*)&npacklen)+nleftlen, pbuf, 4-nleftlen); // 创建数据缓存,并初始化0 if(szpack == NULL) { szpack = (char*)malloc(npacklen); maxlen = npacklen; } // 为减少内存分配次数,当包长度大于当前缓存长度时才重新分配 if(npacklen > maxlen) { szpack = (char*)realloc(szpack, npacklen); } memset(szpack, 0, npacklen); // 记录实际数据包偏移 int noffset = 4-nleftlen; nleftlen = 0; // 计算传入数据包剩余长度 int nleft = nsize - noffset; if(nleft < npacklen) { // 如果传入的长度小于数据包长度 // 设置数据包位不完整包,并记录已缓存的数据长度 ncurlen = nleft; bunbroken = false; // 拷贝数据 memcpy(szpack, pbuf+4, nleft); } else { // 如果传入长度大于数据包长度,拷贝数据 memcpy(szpack, pbuf+noffset, npacklen); // 标记产生一个完整的包, 进行处理 if(ProcessCallback != NULL) { (*ProcessCallback)(szpack, npacklen, pVoid); } bunbroken = true; int ntemplen = npacklen; npacklen = 0; // 继续处理剩余数据 DivPack(pbuf+ntemplen+noffset, nsize-ntemplen-noffset, ProcessCallback, pVoid); } } } private: char* szpack; bool bunbroken; int npacklen; int ncurlen; int nleftlen; int maxlen; }; #endif // __DIVPACK_H__
相关文章推荐
- netty 数据分包、组包、粘包处理机制
- 示例:Netty 处理 TCP数据分包协议
- 实例:Netty 处理 TCP协议数据分包问题
- 蓝牙4.0大数据分包处理
- netty 数据分包、组包、粘包处理机制(二)
- netty 数据分包、组包、粘包处理机制(一)
- netty 数据分包、组包、粘包处理机制(一)
- netty 数据分包、组包、粘包处理
- netty 数据分包、组包、粘包处理机制(二)
- 实例:Netty 处理 TCP协议数据分包问题
- 蓝牙收发数据过大需要分包-组包处理
- jabc连接数据库,处理添加数据时的乱码问题
- Oracle数据库(七)处理数据
- 使用 Kafka 和 Spark Streaming 构建实时数据处理系统
- poi导出大量数据时,arraylist 的 heap space 处理方法
- Android开发-数据缓存策略的处理
- Sklearn用户手册(三): 文本数据的处理
- 使用mongodb处理上亿级别数据
- [MYSQL -11]使用函数处理数据
- 关于XML数据的处理【总结】