怎样判断recv的数据格式是否正确

li602714 2008-04-04 10:31:54
用socket写了个通信程序,定义客户端发送的数据格式为
命令名:参数名1=参数值1, 参数名2=参数值2,...;每命令以‘;’结束
参数个数为0~n个,收到数据后,我怎样判断格式是否正确?我是这样做的:
CString sMsg,stMsg;
char c;
int iMao;
int iDeng;
int iDou;
int iFen;

sMsg = 接收的数据;
sMsg.Remove(' ');
//格式错误:字符串是空串
if(sMsg.IsEmpty() != 0)
{
WriteLog(sMsg + "格式错误:字符串是空串");//写日志
return false;
}

//格式错误:字符串只有一个字符
if(sMsg.GetLength() < 2)
{
WriteLog(sMsg + "格式错误:字符串只有一个字符");
return false;
}

//格式错误:不以;号结束或有多个分号
iFen = sMsg.Find(';');
if((iFen == -1) || (iFen != sMsg.GetLength() - 1))
{
WriteLog(sMsg + "格式错误:不以;号结束或有多个分号");
return false;
}

//格式错误:第一个字符是符号,或者有连续的符号
iMao = sMsg.Find(':');
c = sMsg.GetAt(iMao + 1);
if(!isalnum(c))//((c == ':') || (c == '=') || (c == ';') || (c == ','))
{
WriteLog(sMsg + "格式错误:第一个字符是符号,或者有连续的符号");
return false;
}

//格式错误:第一个字符是符号,或者有连续的符号
iDeng = sMsg.Find('=');
c = sMsg.GetAt(iDeng + 1);
if(!isalnum(c))//((c == ':') || (c == '=') || (c == ';') || (c == ','))
{
WriteLog(sMsg + "格式错误:第一个字符是符号,或者有连续的符号");
return false;
}

//格式错误:第一个字符是符号,或者有连续的符号
iDou = sMsg.Find(',');
c = sMsg.GetAt(iDou + 1);
if(!isalnum(c))//((c == ':') || (c == '=') || (c == ';') || (c == ','))
{
WriteLog(sMsg + "格式错误:第一个字符是符号,或者有连续的符号");
return false;
}

//格式错误:等号应该在冒号后面
if((iMao != -1) && (iDeng < iMao))
{
WriteLog(sMsg + "格式错误:等号应该在冒号后面");
return false;
}

//格式错误:第一个等号前面不应有逗号
if((iDou != -1) && (iDou < iDeng))
{
WriteLog(sMsg + "格式错误:第一个等号前面不应有逗号");
return false;
}

//格式错误:符号不匹配
//没有等号时,不能有冒号和逗号;有等号时,有且只有一个冒号,并且逗号应比等号少一个
iDeng = iDou = iMao = 0;
stMsg = sMsg;
iDeng = stMsg.Remove('=');
stMsg = sMsg;
iMao = stMsg.Remove(':');
stMsg = sMsg;
iDou = stMsg.Remove(',');
if(iDeng != 0)
{
if((iMao != 1) || (iDou != iDeng-1))
{
WriteLog(sMsg + "格式错误:冒号的数量不等于1或者逗号与等号的数量不匹配");
return false;
}
}
else
{
if((iMao != 0) || (iDou != 0))
{
WriteLog(sMsg + "格式错误:当没等号时不应有冒号或逗号出现");
return false;
}
}


我觉得太麻烦了,而且还有些情况不能判断,如call:number=139,num2==,kdkfj;
应该还有更高明的做法吧,
新人分少,请各位帮帮忙!
...全文
144 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
meiZiNick 2008-05-01
  • 打赏
  • 举报
回复
接分先!
skyful123 2008-04-08
  • 打赏
  • 举报
回复
还是同意二楼的
UP
li602714 2008-04-07
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 scq2099yt 的回复:]
都有协议格式了,收数据时按照协议判断即可
[/Quote]

不太明白,能不能说详细一点,谢谢
scq2099yt 2008-04-05
  • 打赏
  • 举报
回复
都有协议格式了,收数据时按照协议判断即可
andywiliang 2008-04-05
  • 打赏
  • 举报
回复
帮顶



请高手坐阵本群管理员
C C++ C# JAVA编程交流群:11713348
andywiliang 2008-04-05
  • 打赏
  • 举报
回复
帮顶



请高手坐阵本群管理员
C C++ C# JAVA编程交流群:11713348
li602714 2008-04-05
  • 打赏
  • 举报
回复
根据2楼的提示查了查资料,发现用正则表达式的确是挺适合的,不过好像C++还要第三方类库才能支持,有点可惜。
谢谢了,找时间要好好研究一下,不过现在在忙项目,还有没有其它方法?
薛勇 2008-04-04
  • 打赏
  • 举报
回复
觉得楼主研究的比我的深,佩服,程序应该是没有问题的。
  • 打赏
  • 举报
回复
用正则吧,挺适合的
caixingxin 2008-04-04
  • 打赏
  • 举报
回复
客户端怎么发应该是由你把握吧~~
只要客户端按照你自己的结构来填充之后再发送应该不会有什么问题的吧...

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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