将表达式定义的数据包从缓冲区取出的类,大家有兴趣的可以进来看看,给点建议,内有源代码,谢谢!
之前我发过一个帖子:
100分,类的设计问题,如何封装才能更方便的使用
http://topic.csdn.net/u/20110212/10/21160b59-b48e-44a0-a778-9ba2a606c781.html
经过几天的努力,我把程序写了出来,请大家指点一下,我编程属于“野路子”,程序里可能有很多问题,希望大家多多指教!
问题的需求:
给定一个表达式,定义出数据包的构成,要求将符合表达式的数据包从缓冲区中取出。
问题的解决:
1.表达式类,我定义了一个表达式的基类,TBaseExpression,里面实现了一个BaseParseBuffer方法,这个方法是将符合包长度的数据取出。
同时设计了2个虚方法:
GetPkgLength 这个函数是让用户实现的,返回数据包的长度,如果用户发现此包的长度不合理,则仍然返回true,但是设置act_len=0
ValidatePkg 这个函数用来验证从baseParseBuffer函数取出的包是否符合用户的需求,如果符合,则返回true
每个表达式类都有一个ID,用来标示不同的表达式。
2.缓冲区类,我定义了一个表达式list,用户调用AddExpession方法来讲表达式的实例加入其中,然后调用putdata函数将数据加入缓冲区,
调用GetPkg函数将匹配数据包取出。
如果开始分配的缓冲区不够,类会自己扩大缓冲区的长度
使用方法如下:
1.首先自定义一个表达式类,从BaseExpression继承
// ---------------------------------------class TExpressionA : public TBaseExpression{public: bool ValidatePkg(unsigned char *pkg, int pkg_len) { if (pkg[0] == 'a' && pkg[1] == 'a') return true; return false; } bool GetPkgLength(unsigned char *pkg, int len, int &actlen) { // 这是固定长度的例子 actlen = 5; return true; } TExpressionA(int _id) : TBaseExpression(_id) { PkgMinLength = 5; // 最小的包的长度,对定长包就是包长度 } // 调用基类的构造函数};//// ---------------------------------------class TExpressionB : public TBaseExpression{public: bool ValidatePkg(unsigned char *pkg, int pkg_len) { if (pkg[1] == 'c' && pkg[2] == 'c') return true; return false; } bool GetPkgLength(unsigned char *pkg, int len, int &actlen) { // 这是长度变化的例子,长度在第一位 char buf[2]; memset(buf, 0, sizeof(buf)); memcpy(buf, pkg, 1); if (!sscanf(buf, "%d", &actlen)) return false; if (actlen <= 0 || actlen > 100) return false; return true; } TExpressionB(int _id) : TBaseExpression(_id) { PkgMinLength = 3; } // 调用基类的构造函数};