sever
#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 answer[50];
int r;
int N;
};
inf infor[300];
int i=0,j,n=0;
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)
{
strcpy(infor[n].uid,uid);
strcpy(infor[n].answer,answer);
infor[n].r=r;
infor[n].N=N;
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);
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)
{
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);
}
fclose(fp);
}