考试管理系统总共分为两个部分,包含客户端和服务端。
客户端主要实现教师或学生的基本操作,服务端主要实现对客户端的监听和实时同步。
一、前期准备工作
1,新建两个VS项目,命名为server和client;
2,分别在两个项目内各个新建一个cpp文件,命名也可以同步server和client;
3,对两个项目分别进行详细的环境配置以对自己的mysql连接成功最准备,参考实训第一天(VS连接数据库)_择启的博客-优快云博客
4,开始cv代码(长篇警告)
服务器(server)
#include "stdafx.h"
#include <stdio.h>
#include <iostream>
#include <string>
#include <cstring>
#include <ctime>
#include <math.h>
#include <WinSock2.h> // 进行网络编程需要winsock2.h
#include <mysql.h>
#include <winsock.h>
#include <wincrypt.h>
#pragma comment(lib,"libmysql.lib")
#pragma comment(lib,"wsock32.lib")
#pragma comment(lib, "ws2_32.lib")
#pragma warning(disable:4996)
using namespace std;
MYSQL mysql;
MYSQL_RES* res;
MYSQL_ROW pp;
MYSQL_FIELD* fd;
string Sans[100], Nans[100], SigScore[100];
char recvBuff[200];
char sendBuff[200];
int TotalScore;
char field[32][32];
bool ConnectDatabase();
bool CreatUser(const char* user);
string LogIn(string lonname, string logpsw);
bool ModifyQue();
bool CreatQue(const char* user);
bool DelectUser(const char* user);
bool ModifyUser(const char* user);
bool SelectUser(const char* ss);
bool CreatTest(int flag);
double round(double r);
int add = 0;
string logname, logpsd;
SOCKET serverSocket;
HANDLE hMutex;
SOCKET connectSocket;
int flag_connect = 1;
DWORD WINAPI Fun_Recv(LPVOID);
DWORD WINAPI Fun_Send(LPVOID);
int main(int argc, char* argv[])
{
ConnectDatabase();
/*
使用socket()创建TCP套接字(socket)。
TCP的套接字就是IP号加端口号。
其中,IP号是网络层用来寻找主机的;端口号是运输层用来找进程的;
在网络层找到主机后就依据端口号找到相应进程
从而实现用户与服务器的通信。*/
//加载套接字
WSADATA wsaData;
int iRet = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (iRet != 0)
{
WSACleanup();
cout << "套接字库加载失败" << endl;
return -1;
}
//第一步:创建套接字
serverSocket = socket(AF_INET, SOCK_STREAM, 0);
if (serverSocket == INVALID_SOCKET)
{
cout << "套接字创建失败" << endl;
return -1;
}
else
{
cout << "套接字创建成功" << endl;
}
//第二步:初始化服务器地址族变量
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(8000);
//第三步:绑定
iRet = bind(serverSocket, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));
if (iRet == SOCKET_ERROR)
{
cout << "绑定失败" << endl;
return -1;
}
else
{
cout << "绑定成功" << endl;
}
//第四步:监听,将套接字设为监听模式,准备接收客户端请求(listen)
iRet = listen(serverSocket, 10);
if (iRet == SOCKET_ERROR)
{
cout << "开启监听失败" << endl;
return -1;
}
else
{
cout << "开启监听成功" << endl;
}
//第五步:接收连接,等待客户请求到来: 当请求到来后,接受连接请求,返回一个对应于此次连接的新的套接字(accept)
SOCKADDR_IN addrClient;
int len = sizeof(SOCKADDR);
connectSocket = accept(serverSocket, (SOCKADDR*)&addrClient, &len);
if (INVALID_SOCKET == connectSocket)
{
cout << "接受连接失败" << endl;
return -1;
}
else
{
cout << "接受连接成功" << endl;
}
//句柄使能准确地访问到对象
//HANDLE Send_Thread = CreateThread(NULL,0,Fun_Send,0,0,NULL);
HANDLE Recv_Thread = CreateThread(NULL, 0, Fun_Recv, 0, 0, NULL);
//CloseHandle(Send_Thread);//关闭句柄
CloseHandle(Recv_Thread);//关闭句柄
hMutex = CreateMutex(NULL, FALSE, L"mutex");//创建互斥量
while (flag_connect)
{
Sleep(100);
}
system("pause");
return 0;
}
bool SelectQue(const char* ss);
bool ConnectDatabase()
{
mysql_init(&mysql);
if (mysql_real_connect(&mysql, "localhost", "root", "123456", "test", 3306, NULL, 0))
{
cout << "Connect OK" << endl;
return true;
}
else
{
cout << "Connect Fail" << mysql_error(&mysql) << endl;
return false;
}
}
bool CreatUser(const char* user)
{
if (!(mysql_query(&mysql, user)))
{
cout << "Connect OK" << endl;
return true;
}
else
{
cout << "Connect Fail" << endl;
return false;
}
}
string LogIn(string logname, string logpsw)
{
string s = "select * from user where name= '" + logname + "' and pwd='" + logpsw + "'";
const char* ss = s.c_str();
mysql_query(&mysql, ss);
res = mysql_store_result(&mysql);
int num = mysql_num_rows(res);
if (num == 0)
{
logname = "用户不存在";
return logname;
}
while (pp = mysql_fetch_row(res))
{
if (pp[1] == logname && pp[2] == logpsw)
{
cout << "登陆成功" << endl;
cout << "登录角色为:" << pp[3] << endl;
}
return pp[3];
}
}
bool CreatQue(const char* user)
{
if (!(mysql_query(&mysql, user)))
{
cout << "Connect OK" << endl;
return true;
}
else
{
cout << "Connect Fail" << endl;
return false;
}
}
bool ModifyUser(const char* user)
{
if (mysql_query(&mysql, user))
{
cout << "修改失败" << mysql_error(&mysql) << endl;
return false;
}
else
{
cout << "修改成功" << endl;
return true;
}
}
bool DelectUser(const char* user)
{
if (mysql_query(&mysql, user))
{
cout << "Delect Fail" << mysql_error(&mysql) << endl;
return false;
}
else
{
cout << "Delect OK" << endl;
return true;
}
}
bool SelectUser(const char* ss)
{
mysql_query(&mysql, "set names gbk");
mysql_query(&mysql, ss);
res = mysql_store_result(&mysql);
add = mysql_num_rows(res);
send(serverSocket, sendBuff, sizeof(sendBuff), 0);
for (int i = 0; fd = mysql_fetch_field(res); i++)
strcpy_s(field[i], fd->name);
int j = mysql_num_fields(res);
for (int i = 0; i < j; i++) {
printf("%10s\t", field[i]);
send(serverSocket, field[i], sizeof(field[i]), 0);
}
cout << endl;
while (pp = mysql_fetch_row(res))
{
for (int i = 0; i < j; i++) {
send(serverSocket, pp[i], sizeof(pp[i]), 0);
printf("%10s\t", pp[i]);
}
cout << endl;
}
return true;
}
bool CreatTest(int flag)
{
string r, qs;
int* number = new int[flag + 1];
getchar();
string s = "select * from que";
const char* ss = s.c_str();
mysql_query(&mysql, "set names gabk");
mysql_query(&mysql, ss);
res = mysql_store_result(&mysql);
int num = (int)mysql_num_rows(res);
unsigned seed;
seed = (int)time(0);
srand(seed);
for (int i = 0; i < flag; i++)
{
number[i] = (int)round(rand() % num + 1);
for (int j = 0; j < i; j++)
{
if (number[j] == number[i])
i--;
}
}
for (int i = 0; i < flag; i++)
{
string number1 = to_string(number[i]);
r = "select * from que where id='" + number1 + "'";
const char* rr = r.c_str();
mysql_query(&mysql, rr);
res = mysql_store_result(&mysql);
pp = mysql_fetch_row(res);
std::string aque, aA, aB, aC, aD;
aque = pp[1];
aA = pp[2];
aB = pp[3];
aC = pp[4];
aD = pp[5];
Sans[i] = pp[6];
SigScore[i] = pp[7];
qs = to_string(i + 1) + ")" + aque + "( )";
strcpy_s(sendBuff, qs.c_str());
send(connectSocket, sendBuff, 200, 0);
qs = "A:" + aA + " " + "B:" + aB + " " + "C:" + aC + " " + "D:" + aD;
strcpy_s(sendBuff, qs.c_str());
send(connectSocket, sendBuff, 200, 0);
qs = "请输入答案:";
strcpy_s(sendBuff, qs.c_str());
send(connectSocket, sendBuff, 200, 0);
recv(connectSocket, recvBuff, 200, 0);
Nans[i] = recvBuff[0];
}
TotalScore = 0;
for (int i = 0; i < flag; i++)
{
qs = (i + 1) + ":" + Sans[i];
strcpy_s(sendBuff, qs.c_str());
send(connectSocket, sendBuff, 200, 0);
if (Nans[i] == Sans[i])
{
int x = atoi(SigScore[i].c_str());
TotalScore += x;
}
}
qs = to_string(TotalScore);
strcpy_s(sendBuff, qs.c_str());
send(connectSocket, sen