按照自己的理解写了几个封包和解包的函数,不知道理解对不对请各位多都指点.

c_hello_world 2011-04-14 02:05:16
由于最近接触到网络编程,所以按照自己的理解写了几个封包和解包的函数,不知道理解对不对请各位多都指点.
先行谢过.

#include <stdafx.h>
#include "Packet.h"
#include <map>
/*
**2011年4月13日
*/


/*
**封包操作
** in:数据包的长度(packLen), 客户端请求的操作(opera), 流水号(id)
**out:数据包的数据(data)
*/
void PackData( string& data, int opera, int id, int packLen)
{
packLen += data.size();
char *temp = new char[12];
_snprintf(temp, 12,"%04d%04d%04d", packLen, opera, id );
temp[12]='\0';
string strHead(temp);
data = strHead.append(data);
}
/*
**解包操作
** in:收到的数据包指针(recvPack), 解包后的数据结构引用(refPacket)
**out:解包后的数据结构引用(refPacket)
*/
void UnPackData( const char *recvPack, PACKET& refPacket )
{
string tempRecvPack(recvPack);

refPacket.m_PacketLength = tempRecvPack.size();
refPacket.m_Data = tempRecvPack.substr(12, refPacket.m_PacketLength - 12);
refPacket.m_Opera = atoi(tempRecvPack.substr(4, 4).c_str());
refPacket.m_Id = atoi(tempRecvPack.substr(8, 4).c_str());
}
/*
**封装JSON
** in:封装前的JSON空串(refJSON), 不定形参的个数(argc)
**out:封装后的JSON串(refJSON)
**PS:不定形参只能为char*类型
*/
void PackJSON( string &refJSON, const int argc,...)
{
string JSON("");
va_list argStart;
va_start(argStart, argc);
for( int j = 0; j < argc; ++j )
{
if( (0 == j % 2) && (0 != j) )
{
JSON.append(";");
}
else if(0 != j % 2)
{
JSON.append(":");
}
else{}
JSON.append( string(va_arg(argStart, char*)));
}
va_end(argStart);
refJSON = JSON;
}

/*
**解封JSON
** in:封装好的JSON串(refJSON)
**out:解封后的数据集合(refUnJSON)
*/
void UnPackJSON( map<string, string>& refUnJSON,const string &refJSON)
{
const char *ptrJSON = refJSON.c_str();
int begin = 0, end = 0;
string key(""), value("");

for(int i = 0; i <= refJSON.size(); ++i )
{
if(*(ptrJSON + i) == ':')
{
end = i;
key = refJSON.substr(begin, end - begin);
begin = end + 1;
}
if( *(ptrJSON + i) == ';' || *(ptrJSON + i) == '\0')
{
end = i;
value = refJSON.substr(begin, end - begin);
begin = end + 1;
refUnJSON[key] = value;
}
}
}

...全文
202 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
这不是鸭头 2011-04-14
  • 打赏
  • 举报
回复
第一个函数有内存泄露。
lijianli9 2011-04-14
  • 打赏
  • 举报
回复
还不错。但是发现没有异常处理判断 。
许文君 2011-04-14
  • 打赏
  • 举报
回复
能跑起来,两边对流无问题的都是对的,自己测试下就行。
pathuang68 2011-04-14
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 jixingzhong 的回复:]

可以分别写一个client和server,测试一下函数是否工作正常。
[/Quote]
嗯,实践是检验真理的唯一标准。
书虫 2011-04-14
  • 打赏
  • 举报
回复
编程风格挺好的,O(∩_∩)O~
jixingzhong 2011-04-14
  • 打赏
  • 举报
回复
可以分别写一个client和server,测试一下函数是否工作正常。
ifengshow 2011-04-14
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 pamtry 的回复:]
1、PackData 函数,temp指针new的内存泄露,没有对应delete

2、_snprintf(temp, 12,"%04d%04d%04d", packLen, opera, id );
其实,如果只是范围不大的自用,没有必要在二进制和字符串之间进行刻意的转换
将packLen, opera, id定义为int32_t确保都是32位数据,解封包的时候直接进行操作就可以了……
[/Quote]up
pamtry 2011-04-14
  • 打赏
  • 举报
回复
1、PackData 函数,temp指针new的内存泄露,没有对应delete

2、_snprintf(temp, 12,"%04d%04d%04d", packLen, opera, id );
其实,如果只是范围不大的自用,没有必要在二进制和字符串之间进行刻意的转换
将packLen, opera, id定义为int32_t确保都是32位数据,解封包的时候直接进行操作就可以了,对于频繁调用的情况,也算是减少负担了吧
不过这种情况,就不太适合用string来保存PackageHead了,需要用2进制容器
昵称很不好取 2011-04-14
  • 打赏
  • 举报
回复
封包数据附在尾部?

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧