#pragma comment(lib, "ws2_32.lib")
#include <winsock2.h>
#include <windows.h>
#include <process.h>
#include <stdio.h>
#include <string.h>
#include <fstream.h>
#include <iostream.h>
#include <conio.h>
#include <time.h>
#define MAX_CLIENT_NUM 64
#define MAX_ONLINE_USER_NUM 64
#define MAX_USERS_NUM 512
#define MAX_MSG_SIZE 512
/////////////////////////////
SOCKET ListenSocket;
SOCKET client[MAX_CLIENT_NUM];
char buf[MAX_CLIENT_NUM][MAX_MSG_SIZE];
char timeBuf[128];
int userNumOnLine = 0;
int userDistance = 0;
bool close = false;
fd_set rset, allset; //allset——所有套接口, rset——可读套接口
/////////////////////////////
bool bindAndListen(SOCKET,struct sockaddr_in);
void selectAndAccept(SOCKET);
void sendToAll(int);
void sendToOne(SOCKET , char* , int , char* , int , int);
void sendUser(SOCKET);
void commandExplan1(char * , int , SOCKET , int);
void commandExplan2(char * , int , SOCKET , int);
void login(SOCKET , char* , int , char* , int , int);
void adLogin(SOCKET , char* , int , int);
void adManage(void*);
void adCommand(SOCKET,char*,int);
void sendAlluser(SOCKET);
void shutDown(SOCKET,char*,int);
void del(SOCKET,char*,int);
void regist(SOCKET , char* , int , char* , int , int);
void logout(SOCKET , int);
void userexit(int);
void closeServer(void *);
bool checkOnLine(char * , int );
bool checkOnData(char * , int );
bool checkPassword(char * , int );
/////////////////////////////
typedef struct user{
char name[20];
char password[20];
// int count;
}USER;
USER usersOnLine[MAX_ONLINE_USER_NUM];
USER usersOnData[MAX_USERS_NUM];
/////////////////////////////
//
/////////////////////////////
bool bindAndListen(SOCKET sock,struct sockaddr_in sockAddr)
{
if (bind( sock, (SOCKADDR*) &sockAddr, sizeof(sockAddr)) == SOCKET_ERROR)
{
cout<<"Error at bind()."<<endl;
closesocket(sock);
WSACleanup();
return false;
}
if (listen( sock, 1 ) == SOCKET_ERROR)
{
cout<<"Error at listen()."<<endl;
closesocket(sock);
WSACleanup();
return false;
}
cout<<"Server start success."<<endl;
memset(timeBuf,0,128);
_strdate(timeBuf);
printf("Today is : %s\n",timeBuf);
return true;
}
/////////////////////////////
//
//
/////////////////////////////
void commandExplan1(char *cmd , int length ,SOCKET s ,int stat)
{
int i=0;
int j=0;
char recv[50];
memset(recv,0,50);
for(i=0;i<length;i++)
{
recv[i]=*(cmd+i);
}
char command[10];
memset(command,0,10);
char username[20];
memset(username,0,20);
char password[20];
memset(password,0,20);
for(i=1,j=0;recv[i]!='$'&&i<length;i++,j++)
command[j]=recv[i];
for(i+=1,j=0;recv[i]!='$'&&i<length;i++,j++)
username[j]=recv[i];
for(i+=1,j=0;recv[i]!='$'&&i<length;i++,j++)
password[j]=recv[i];
if(strcmp(command,"login") == 0)
login(s,username,strlen(username),password,strlen(password),stat);
else if(strcmp(command,"adlogin") == 0)
adLogin(s,password,strlen(password),stat);
else if(strcmp(command,"regist") == 0)
regist(s,username,strlen(username),password,strlen(password),stat);
else if(strcmp(command,"logout")==0)
logout(s,stat);
else if(strcmp(command,"exit")==0)
userexit(stat);
else
send(s,"Command error...",17,0);
}
/////////////////////////////
void commandExplan2(char *cmd , int length ,SOCKET s ,int stat)
{
int i=0;
int j=0;
int count=0;
char error[]="Error command...";
char help[]="Use ## to get the username on line | use #username#msg to send msg to username.";
char recv[MAX_MSG_SIZE+20];
memset(recv,0,MAX_MSG_SIZE+20);
for(i=0;i<length;i++)
{
recv[i]=*(cmd+i);
if(recv[i]=='#')
count++;
}
char command[20];
memset(command,0,20);
char username[20];
memset(username,0,20);
char msg[MAX_MSG_SIZE];
memset(msg,0,MAX_MSG_SIZE);
for(i=1,j=0;recv[i]!='#';i++,j++)
username[j]=recv[i];
for(i+=1,j=0;i<length;i++,j++)
msg[j]=recv[i];
if(strcmp(recv,"##")==0)
sendUser(s);
else if(recv[1]!='#'&&count==2)
sendToOne(s,username,strlen(username),msg,strlen(msg),stat);
else
send(s,error,strlen(error),0);
}
/////////////////////////////
//
////////////////////////////
void regist(SOCKET s, char* name, int length_name,
char* password, int length_password ,int stat)
{
int i;
char nameBuf[20];
memset(nameBuf,0,20);
for(i=0;i<length_name;i++)
nameBuf[i]=*(name+i);
char passwordBuf[20];
memset(passwordBuf,0,20);
for(i=0;i<length_password;i++)
passwordBuf[i]=*(password+i);
char askBuf[30];
memset(askBuf,0,30);
bool done = false;
if(checkOnData(nameBuf,length_name))
strcpy(askBuf,"Username was regsited!");
else{
USER temp;
strcpy(temp.name,nameBuf);
strcpy(temp.password,passwordBuf);
fstream f_data("data.txt",ios::app);
f_data.write((char*)&temp,sizeof(USER));
f_data.close();
done = true;
strcpy(askBuf,"SUCCESS");
}
int sByte = send(s,askBuf,strlen(askBuf),0);
if(sByte == SOCKET_ERROR)
{
cout<<"Error at send()."<<endl;
}
else{
if(done)
cout<<nameBuf<<" regist success..."<<endl;
}
}
/////////////////////////////
void login(SOCKET s, char* name, int length_name,
char* password, int length_password ,int stat)
{
int i;
char nameBuf[20];
memset(nameBuf,0,20);
for(i=0;i<length_name;i++)
nameBuf[i]=*(name+i);
char passwordBuf[20];
memset(passwordBuf,0,20);
for(i=0;i<length_password;i++)
passwordBuf[i]=*(password+i);
char askBuf[30];
memset(askBuf,0,30);
bool done = false;
if(checkOnData(nameBuf,length_name))
{
if(checkOnLine(name,length_name))
{
strcpy(askBuf,"User already on line .");
}
else{
if(checkPassword(passwordBuf,length_password))
{
done = true;
userNumOnLine++;
strcpy(askBuf,"SUCCESS");
cout<<nameBuf<<" login success..."<<endl;
}else
{
strcpy(askBuf,"Password error!");
}
}
}else
{
strcpy(askBuf,"Unregist username!");
}
int sByte = send(s,askBuf,strlen(askBuf),0);
if(sByte == SOCKET_ERROR)
{
cout<<"Error at send()."<<endl;
}
else{
if(done)
{
strcpy(usersOnLine[stat].name,nameBuf);
strcpy(usersOnLine[stat].password,passwordBuf);
}
}
}
/////////////////////////////
bool online=false;
void adLogin(SOCKET s,char* password, int length_password ,int stat)
{
int i;
char passwordBuf[20];
memset(passwordBuf,0,20);
for(i=0;i<length_password;i++)
passwordBuf[i]=*(password+i);
char askBuf[30];
memset(askBuf,0,30);
if(online)
strcpy(askBuf,"Administrator is already online...");
else if(strcmp(passwordBuf,"Adminpassword")==0)
{
online=true;
strcpy(usersOnLine[stat].name,"Administrator");
memset(usersOnLine[stat].password,0,20);
strcpy(askBuf,"SUCCESS");
}else
{
strcpy(askBuf,"Login error...");
}
int sByte = send(s,askBuf,strlen(askBuf),0);
if(sByte == SOCKET_ERROR)
{
cout<<"Error at send()."<<endl;
}
if(strcmp(askBuf,"SUCCESS")==0)
{
cout<<"Administrator login ..."<<endl;
}
}
void adCommand(SOCKET s,char* cmd,int cmd_length)
{
int i=0;
int j=0;
int count=0;
char error[]="Command error...";
char recv[512];
memset(recv,0,512);
for(i=0;i<cmd_length;i++)
{
recv[i]=*(cmd+i);
if(recv[i]=='#')
count++;
}
char command[20];
memset(command,0,20);
for(i=1,j=0;recv[i]!='#'&&i<cmd_length;i++,j++)
command[j]=recv[i];
char username[20];
memset(username,0,20);
for(i+=1,j=0;recv[i]!='#'&&i<cmd_length;i++,j++)
username[j]=recv[i];
if(count==1)
send(s,"Command error...",17,0);
else
{
if(strcmp(recv,"##")==0)
sendUser(s);
else if(strcmp(recv,"###")==0)
sendAlluser(s);
else if(strcmp(command,"shutdown")==0)
shutDown(s,username,strlen(username));
else if(strcmp(command,"del")==0)
del(s,username,strlen(username));
else
send(s,"Command error...",17,0);
//if(recv[2]=='#')
//send(s,"sendalluse",11,0);
//if(count==1