怎样判断recv的数据格式是否正确
用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;
应该还有更高明的做法吧,
新人分少,请各位帮帮忙!