编程实习程序2015.9.11 By Quex
//采用C语言编写,但使用了一些C++语法,比如bool类型等,编译工具VC++6.0
Tool.h文件
<pre name="code" class="cpp">#ifndef TOOL_H
#define TOOL_H
#include "stdio.h"
#include <stdlib.h>
#include "string.h"
#include<ctype.h>
void substr(char*des,char* src,int start,int end);
int find(char* src,char* des);
void Split(const char* str, char* delims);
bool IsDigit(char* str);
void WriteData(char* data);
int RandPort();
#define FILE_DIR "comm.txt"
extern char* pStr[15];
extern int length;
#endif
Tool.cpp文件
#include "Tool.h"
char* pStr[15];
int length = 0;
//自定义Split()函数//
//参数:/
//1:要分割的字符串///
//2:分隔符///
//功能:实现分割字符串//
void Split(const char* str, char* delims)
{
char *p;
char*buffer;
length = 0;
buffer = strdup(str);
p = strtok(buffer, delims);
pStr[length++] = p;
while (p != NULL) {
p = strtok(NULL, delims);
pStr[length++] = p;
}
length--;
}
//自定义IsDigit()函数
//参数:/
//1:要判断的字符串///
//功能:判断字符串是否是数字/
bool IsDigit(char* str)
{
int i;
for (i = 0; str[i] != 0; i++)
{
if (!isdigit(str[i]))
return false;
}
return true;
}
void substr(char*des,char* src,int start,int end)
{
char* pDes=des;
int i;
if(end==-1)
{
end=strlen(src);
}
for(i=start;i<end;i++)
{
*pDes=src[i];
pDes++;
}
*pDes='\0';
}
int find(char* src,char* des)
{
char* pSrc=src;
char* pDes=des;
while(*pSrc!='\0')
{
if(*pSrc==*pDes)
{
pSrc++;
pDes++;
}else
{
pSrc++;
pDes=des;
}
if(*pDes =='\0')
return (pSrc-src-strlen(des));
}
return -1;
}
int RandPort()
{
srand((unsigned )time(NULL));
return rand()%501+9000;
}
void WriteData(char* data)
{
FILE *fp;
fp = fopen(FILE_DIR, "a");
fputs(data, fp);
fclose(fp);
}
main.cpp
#include "stdio.h"
#include "Tool.h"
bool bConnected=false;
bool bConfirmed=false;
bool bFlag=false;
int iPort=9000;
char tempStr[100];
void Connect(char* cmd,char* data)
{
char strPort[10];
int randPort = RandPort();
if(bConnected)
{
sprintf(tempStr,"#MBF#<Connect>2,%d,%d#MEF#\r\n已链接...\r\n", iPort,randPort );
printf(tempStr);
WriteData(tempStr);
return;
}
sprintf(strPort,"%d",iPort);
if(strcmp(data,strPort)==0)
{
sprintf(tempStr,"#MBF#<Connect>0,%d,%d#MEF#\r\n链接成功...\r\n", iPort,randPort );
printf(tempStr);
bConnected=true;
WriteData(tempStr);
return;
}else
{
sprintf(tempStr,"#MBF#<Connect>1,%d,%d#MEF#\r\n端口号不正确...\r\n", iPort,randPort );
printf(tempStr);
WriteData(tempStr);
return;
}
}
void Confirm(char* cmd,char* data)
{
char user[20];
char psw[20];
substr(user,data,0,find(data,","));
substr(psw,data,find(data,",")+1,-1);
if(!bConnected)
{
sprintf(tempStr,"#MBF#<Confirm>%s,3#MEF#\r\n用户尚未连接...\r\n",user);
printf(tempStr);
WriteData(tempStr);
return ;
}
if(bConfirmed)
{
sprintf(tempStr,"#MBF#<Confirm>%s,2#MEF#\r\n用户已验证...\r\n",user);
printf(tempStr);
WriteData(tempStr);
return ;
}
if(strcmp(user,"hehe")==0 && strcmp(psw,"xixi")==0)
{
sprintf(tempStr,"#MBF#<Confirm>%s,0#MEF#\r\n验证成功...\r\n",user);
printf(tempStr);
WriteData(tempStr);
bConfirmed=true;
return;
}else
{
sprintf(tempStr,"#MBF#<Confirm>%s,1#MEF#\r\n用户名或密码错误...\r\n",user);
printf(tempStr);
WriteData(tempStr);
}
}
void GetData(char* cmd,char* data)
{
//检查是否认证
if(!bConnected || !bConfirmed)
{
sprintf(tempStr,"未认证...输入不合法\r\n");
printf(tempStr);
WriteData(tempStr);
return ;
}
Split(data,",");
//情况2:是否为数字/是否超出范围
for (int i = 0;i < length;i++)
{
if (!IsDigit(pStr[i]))
{
sprintf(tempStr,"#MBF#<Data>%s,2#MEF#\r\n存在非数字...\r\n", pStr[0]);
printf(tempStr);
WriteData(tempStr);
return;
}
else
{
int value = atoi(pStr[i]);
if (i>0 && (value < 840 || value > 960))
{
sprintf(tempStr,"#MBF#<Data>%s,2#MEF#\r\n数字不在(840-960)范围...\r\n", pStr[0]);
printf(tempStr);
WriteData(tempStr);
return;
}
}
}
//情况0
if (atoi(pStr[0])==length-1)//如果第一个数字和length相等 :#MBF#<Data>length,0#MEF#
{
sprintf(tempStr,"#MBF#<Data>%s,0#MEF#\r\n通信成功...\r\n",pStr[0]);
printf(tempStr);
WriteData(tempStr);
}
else//情况1
{
sprintf(tempStr,"#MBF#<Data>%s,1#MEF#\r\n长度不一致....\r\n", pStr[0]);
printf(tempStr);
WriteData(tempStr);
}
}
void DealMessage(char* revStr)
{
bFlag=false;
if (find(revStr,"#MBF#") == -1)
{
sprintf(tempStr,"输入不合法....\r\n");
printf(tempStr);
WriteData(tempStr);
revStr='\0';
return;
}
if (find(revStr,"#MEF#") == -1)
{
sprintf(tempStr,"包不完整...请继续输入...\r\n");
printf(tempStr);
WriteData(tempStr);
bFlag=true;
return;
}
//校验首尾
char cmd[10];
char data[50];
substr(cmd,revStr,find(revStr,"<")+1,find(revStr,">"));
substr(data,revStr,find(revStr,">")+1,find(revStr,"#MEF#"));
if(strcmp(cmd,"Connect")==0)
{
Connect(cmd,data);
}else if(strcmp(cmd,"Confirm")==0)
{
Confirm(cmd,data);
}else if(strcmp(cmd,"Data")==0)
{
GetData(cmd,data);
}
revStr[0] = '\0';
return;
}
void Show()
{
printf("**************人机交互模拟客户机*********\r\n");
printf("* 1.链接请求 *\r\n");
printf("* 2.认证请求 *\r\n");
printf("* 3.数据发送 *\r\n");
printf("* 4.结束程序 *\r\n");
printf("* 编程目的:编程实习 2015.9.11 *\r\n");
printf("* 账号:hehe 密码:xixi 端口:9000 *\r\n");
printf("*****************************************\r\n");
}
void Operate()
{
int iReqIndex;
char sendBuf[50]="";
static char cRevBuf[100]="\0";
if(bFlag==false)
{
printf("请输入操作序号(1-4):");
while(scanf("%d",&iReqIndex) != 1)//防止输入非数字时出错
{
fflush(stdin);
printf("请输入操作序号(1-4):");
}
switch(iReqIndex)
{
case 1:
{
printf("请输入链接请求包:");
}break;
case 2:
{
printf("请输入认证请求包:");
}break;
case 3:
{
printf("请输入数据包:");
}break;
case 4:
exit(0);
default:
Operate();
break;
}
}
scanf("%s",sendBuf);
strcat(cRevBuf,sendBuf);
WriteData(sendBuf);
WriteData("\r\n");
DealMessage(cRevBuf);
}
void main()
{
Show();
while(1)
{
Operate();
}
}