一次性口令实验server-client部分

 sever
 // sever.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include"stdio.h"
#include "stdlib.h"
#include "string.h"
#include "winsock2.h"
#include<iostream>
#include<fstream>
#include <cstring>
#include "md5.h"
#include "MsgBoxTimeout.h"
#pragma comment(lib,"ws2_32.lib")
void ErrorHandling(char* message);
#define BUF_SIZE 30
using namespace std;
void *memcpy(void *dst, void *src, size_t size);
void ErrorHandling(char* message)
{
	fputs(message,stderr);
	fputc('\n',stderr);
	exit(1);
}

struct inf  //用户存储的信息结构
{
	char uid[50]; //用户名
	//char password[50]; //密码
	char answer[50]; //应答值
	int r;   //随机数
	int N;   //挑战值 
	 
};
inf infor[300];  //最多有300个用户 
int i=0,j,n=0;       //全局变量n,用于表示是目前系统中用户数,目前是五个 
FILE *p;

void update();
void init()    
{

	char uid[50],password[50],answer[50];
	int r,N;
	fstream file; 
	file.open("d:\\lib.txt",ios::in);
	if(!file);
	else
	{
		while(file>>uid>>answer>>r>>N)     //将文件中的uid、password赋值给结构体 
		{
			strcpy(infor[n].uid,uid);
			//strcpy(infor[n].password,password);
			strcpy(infor[n].answer,answer);
			infor[n].r=r;
			infor[n].N=N;
			//cout<<infor[n].uid<<"  "<<infor[n].password<<"  "<<endl;  //读出原来文件的uid、password
			n++;
		}
	}
	file.close();
}

int _tmain(int argc, _TCHAR* argv[])
{
	WSADATA wsaData;
	SOCKET hServSock,hClntSock;
	FILE * fp,*p;
	char buf[BUF_SIZE] ;
	char buf2[BUF_SIZE];
	char buf3[BUF_SIZE] ;
	char ans[200]={'\0'};
	char answer[50];
	int readCnt;
     int m=0,t=0 ;
	SOCKADDR_IN servAddr,clntAddr;
	int clntAddrSz;

	system("taskkill /f /t /im       D: \\一次性口令实验\\cs\\sever\\Debug\\client.exe");
	system("taskkill /f /t /im       D:\\ 一次性口令实验\\cs\\sever\\Debug\\sever.exe");
	system("taskkill /f /t /im       D: \\一次性口令实验\\ reg\\Debug\\reg.exe");

    init();
	if (argc!=2)
	{
		printf( "Usage:%s<port>\n",argv[0]);
		exit(1);
	}
	if (WSAStartup(MAKEWORD(2,2),&wsaData)!=0)

		ErrorHandling("WSAStartup() error!");

	

	hServSock=socket(PF_INET,SOCK_STREAM,0);

	memset(buf,0,sizeof(buf));
	 memset(buf2,0,sizeof(buf2));
	 memset(buf3,0,sizeof(buf3));
	memset(&servAddr,0,sizeof(servAddr));
	servAddr.sin_family=AF_INET;
	servAddr.sin_addr.s_addr=htonl(INADDR_ANY);
	servAddr.sin_port=htons(atoi(argv[1]));

	bind(hServSock,(SOCKADDR*)&servAddr,sizeof(servAddr));
	listen(hServSock,5);
	clntAddrSz=sizeof(clntAddr);
	hClntSock=accept(hServSock,(SOCKADDR*)&clntAddr,&clntAddrSz);
	recv(hClntSock,(char*)buf,BUF_SIZE,0);
	fp=fopen("d:\\sever用户名.txt","wt+");
	fprintf(fp,"%s",buf);
	fclose(fp);	

	for(i=0;i<n;i++)           //循环逐一匹配寻找用户名 
	{
		if(strcmp(infor[i].uid,buf)==0)
		{
			fp=fopen("d:\\s随机数.txt","wt+");
			fprintf(fp,"%d",infor[i].r);
			fclose(fp);

			fp=fopen("d:\\s挑战值.txt","wt+");
			fprintf(fp,"%d",infor[i].N);
			fclose(fp);
			break;
		}
		 

	}

    p=fopen("d:\\s随机数.txt","rb");
	while(1)
	{
		if (feof(p)) break;
	fscanf(p,"%s",buf2);
	send(hClntSock,(char*)buf2,BUF_SIZE,0);
	}
	fclose(fp);	

	fp=fopen("d:\\s挑战值.txt","rb");
	while(1)
	{
		if (feof(fp)) break;
		fscanf(fp,"%s",buf3);
		send(hClntSock,(char*)buf3,BUF_SIZE,0);
	}
	fclose(fp);	
	 
	 
		recv(hClntSock,(char*)ans,200,0);
		strcpy(answer,MD5String(ans));
		
	for(i=0;i<n;i++)           //循环逐一匹配寻找用户名 
  {
			
	if(strcmp(infor[i].uid,buf)==0)
	{

	if(strcmp(infor[i].answer,answer)==0)
	{
		
		if(infor[i].N<=1)
		{
			ShellExecute(NULL, "open","cmd.exe", "/c   D:\\ 一次性口令实验\\chongzhi\\chongzhi\\Debug\\chongzhi.exe",NULL, 0);
			system("taskkill /f /t /im       D:\\ 一次性口令实验\\ chongzhi\\chongzhi\\Debug\\chongzhi.exe");
			break;
		}
		else
		{
			strcpy(infor[i].answer,ans);
			MessageBox(NULL,TEXT("用户认证成功!"),TEXT("提示"),MB_OK | MB_SYSTEMMODAL);
			infor[i].N=infor[i].N-1; 
			update();
			break;

		  }
		 		
	     }
	     
	   }			 
					
	}
	if(i==n)
	{
		MessageBox(NULL,TEXT("用户认证失败!"),TEXT("提示"),MB_OK | MB_SYSTEMMODAL);
		//break;
		fp=fopen("d:\\认证失败次数.txt","r+");
		fscanf(fp,"%d",&m);
		++m;
		fclose(fp);
		fp=fopen("d:\\认证失败次数.txt","wt+");
		fprintf(fp,"%d",m);
		fclose(fp);
	}

	fp=fopen("d:\\认证失败次数.txt","r+");
	fscanf(fp,"%d",&t);
	fclose(fp);
	if(t>=3)
	{
		
		 //UINT uiFlags =  MB_SETFOREGROUND | MB_SYSTEMMODAL | MB_ICONINFORMATION;
		//MessageBoxTimeout(NULL, _T(" 认证失败次数过多,请10s以后再试."),
			//_T("MessageBoxTimeout "), uiFlags, 0, 10000);
		MessageBox(NULL,TEXT("认证失败次数过多,请10s以后再试"),TEXT("提示"), MB_OK|MB_SYSTEMMODAL);
		Sleep(10000);
		t=0;
		fp=fopen("d:\\认证失败次数.txt","wt+");
		fprintf(fp,"%d",t);
		MessageBox(NULL,TEXT("现在可重新尝试"),TEXT("提示"),MB_OK | MB_SYSTEMMODAL);
		
		fclose(fp);
	}

		


	closesocket(hClntSock);closesocket(hServSock);
	WSACleanup();
	system("pause");
	return 0;
}


void update()
{

	FILE *fp;
	fp = fopen("d:\\lib.txt","w+");//打开模式可以换成其他
	for(j=0;j<n;j++)
	{
		fprintf(fp,"%s %s  %d %d \n",infor[j].uid,infor[j].answer,infor[j].r,infor[j].N);//就这么简单用fprintf函数写数据
	}
	fclose(fp);
}
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值