VS+MYSQL考试管理系统(白piao速成版)

考试管理系统总共分为两个部分,包含客户端和服务端。

客户端主要实现教师或学生的基本操作,服务端主要实现对客户端的监听和实时同步。

一、前期准备工作

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值