编程实习程序

编程实习程序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();
	}

}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值