VS+MYSQL考试管理系统(白piao速成版)
考試管理系統總共分為兩個部分,包含客戶端和服務端。
客戶端主要實現教師或學生的基本操作,服務端主要實現對客戶端的監聽和實時同步。
一、前期準備工作
1,新建兩個VS項目,命名為server和client;
2,分別在兩個項目內各個新建一個cpp文件,命名也可以同步server和client;
3,對兩個項目分別進行詳細的環境配置以對自己的mysql連接成功最準備,參考實訓第一天(VS連接數據庫)_擇啟的博客-CSDN博客
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, sendBuff, 200, 0);delete number;return true; } double round(double r) {return(r > 0.0) ? floor(r + 0.5) : ceil(r - 0.5); } bool SelectQue(const char* ss) {mysql_query(&mysql, "set names gbk");mysql_query(&mysql, ss);res = mysql_store_result(&mysql);mysql_query(&mysql, ss);MYSQL_RES* result;result = mysql_store_result(&mysql);int nfd = mysql_num_fields(result);//返回結果集中的行數int nrw = mysql_num_rows(result);//返回結果集中的行數MYSQL_ROW ro;MYSQL_FIELD* fd;ro = mysql_fetch_row(result);//獲取行數fd = mysql_fetch_field(result);//獲取字段信息if (mysql_affected_rows(&mysql) == 0) {cout << "查詢錯誤" << endl;return false;}else {for (int i = 0; i < nfd; i++){printf("%-8s\t", fd[i].name);//獲取字段名字}cout << endl;if (ro) {for (int i = 0; i < nfd; i++){printf("%-8s\t", ro[i]);}cout << endl;}while (ro = mysql_fetch_row(result)) {for (int i = 0; i < nfd; i++){printf("%-8s\t", ro[i]);}cout << endl;}}mysql_free_result(result);return true; } DWORD WINAPI Fun_Recv(LPVOID) {string logname1, logpsw1, s;while (1){int iRet = recv(connectSocket, recvBuff, 200, 0);logname1 = recvBuff;cout << recvBuff << endl;recv(connectSocket, recvBuff, 200, 0);logpsw1 = recvBuff;cout << recvBuff << endl;if (LogIn(logname1, logpsw1) == "t" || LogIn(logname1, logpsw1) == "T"){s = "登錄成功,角色為教師";strcpy_s(sendBuff, s.c_str());send(connectSocket, sendBuff, sizeof(sendBuff), 0);s = "1";strcpy_s(sendBuff, s.c_str());send(connectSocket, sendBuff, sizeof(sendBuff), 0);break;}else if (LogIn(logname1, logpsw1) == "s" || LogIn(logname1, logpsw1) == "S"){s = "登錄成功,角色為學生";strcpy_s(sendBuff, s.c_str());send(connectSocket, sendBuff, sizeof(sendBuff), 0);s = "2";strcpy_s(sendBuff, s.c_str());send(connectSocket, sendBuff, sizeof(sendBuff), 0);break;}else{s = "shibai";strcpy_s(sendBuff, s.c_str());send(connectSocket, sendBuff, sizeof(sendBuff), 0);}if (iRet <= 0){cout << "接受線程關閉鏈接" << endl;closesocket(serverSocket);WSACleanup();flag_connect = 0;return -1;}}while (true){recv(connectSocket, recvBuff, 200, 0);if (recvBuff[0] == '1'){while (true){recv(connectSocket, recvBuff, 200, 0);string s = recvBuff;const char* sss = s.c_str();SelectUser(sss);break;}}else if (recvBuff[0] == '2'){while (true){recv(connectSocket, recvBuff, 200, 0);string s = recvBuff;const char* ss = s.c_str();if (CreatUser(ss) == true){strcpy_s(sendBuff, "1");send(connectSocket, sendBuff, 200, 0);break;}else{strcpy_s(sendBuff, "2");send(connectSocket, sendBuff, 200, 0);break;}}}else if (recvBuff[0] == '3'){int flag, sscore[100], tscore = 0;string sans[100], nans[100];string r, qs, s;while (true){recv(connectSocket, recvBuff, 200, 0);sscanf_s(recvBuff, "%d", &flag);int* number = new int[flag + 1];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(NULL);srand(seed);for (int i = 0; i < flag; i++){number[i] = rand() % num;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]);cout << number1 << endl;r = "select * from que limit " + number1 + ",1;";const char* rr = r.c_str();mysql_query(&mysql, rr);res = mysql_store_result(&mysql);pp = mysql_fetch_row(res);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];sscore[i] = atoi(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);}recv(connectSocket, recvBuff, 200, 0);for (int i = 0; i < flag; i++){nans[i] = recvBuff[i];if (nans[i] == sans[i]){tscore += sscore[i];}}qs = to_string(tscore);strcpy_s(sendBuff, qs.c_str());send(connectSocket, sendBuff, 200, 0);delete number;break;}}else if (recvBuff[0] == '4'){while (true){recv(connectSocket, recvBuff, 200, 0);string s = recvBuff;const char* ss = s.c_str();if (CreatQue(ss) == true){strcpy_s(sendBuff, "1");send(connectSocket, sendBuff, 200, 0);break;}else{strcpy_s(sendBuff, "2");send(connectSocket, sendBuff, 200, 0);break;}}}else if (recvBuff[0] == '5'){while (true){recv(connectSocket, recvBuff, 200, 0);string s = recvBuff;const char* ss = s.c_str();if (DelectUser(ss) == true){strcpy_s(sendBuff, "1");send(connectSocket, sendBuff, 200, 0);break;}else{strcpy_s(sendBuff, "2");send(connectSocket, sendBuff, 200, 0);break;}}}else if (recvBuff[0] == '6'){while (true){recv(connectSocket, recvBuff, 200, 0);string s = recvBuff;const char* ss = s.c_str();if (CreatQue(ss) == true){strcpy_s(sendBuff, "1");send(connectSocket, sendBuff, 200, 0);break;}else{strcpy_s(sendBuff, "2");send(connectSocket, sendBuff, 200, 0);break;}}}else if (recvBuff[0] == '7') {while (true){recv(connectSocket, recvBuff, 200, 0);string s = recvBuff;const char* ss = s.c_str();if (CreatQue(ss) == true){strcpy_s(sendBuff, "1");send(connectSocket, sendBuff, 200, 0);break;}else{strcpy_s(sendBuff, "2");send(connectSocket, sendBuff, 200, 0);break;}break;}}else if (recvBuff[0] == '8') {continue;}else if (recvBuff[0] == '9') {string nqid, nqname, nqa, nqb, nqc, nqd, nqans, nqscore, oldqname;/*cout << "請輸入需要修改的題目:" << endl;cin >> oldqname;*/recv(connectSocket, recvBuff, sizeof(recvBuff), 0);oldqname = recvBuff;/*cout << "請輸入新的題號:" << endl;cin >> nqid;*/recv(connectSocket, recvBuff, sizeof(recvBuff), 0);nqid = recvBuff;/*cout << "請輸入新的題目:" << endl;cin >> nqname;*/recv(connectSocket, recvBuff, sizeof(recvBuff), 0);nqname = recvBuff;/*cout << "請輸入新的A選項:" << endl;cin >> nqa;*/recv(connectSocket, recvBuff, sizeof(recvBuff), 0);nqa = recvBuff;/*cout << "請輸入新的B選項:" << endl;cin >> nqb;*/recv(connectSocket, recvBuff, sizeof(recvBuff), 0);nqb = recvBuff;/*cout << "請輸入新的C選項:" << endl;cin >> nqc;*/recv(connectSocket, recvBuff, sizeof(recvBuff), 0);nqc = recvBuff;/*cout << "請輸入新的D選項:" << endl;cin >> nqd;*/recv(connectSocket, recvBuff, sizeof(recvBuff), 0);nqd = recvBuff;/*cout << "請輸入新題目的答案:" << endl;cin >> nqans;*/recv(connectSocket, recvBuff, sizeof(recvBuff), 0);nqans = recvBuff;/*cout << "請輸入新題目的分值:" << endl;cin >> nqscore;*/recv(connectSocket, recvBuff, sizeof(recvBuff), 0);nqscore = recvBuff;string Mque = "select * from que where name = \"" + nqname + "\"";const char* ss = Mque.c_str();mysql_query(&mysql, "set names gbk");mysql_query(&mysql, ss);res = mysql_store_result(&mysql);if (mysql_num_rows(res) > 0){strcpy_s(sendBuff, "新題目的名字有重復,修改不成功");send(connectSocket, sendBuff, sizeof(sendBuff), 0);}Mque = "update que set id = \"" + nqid + "\"," + "name=\"" + nqname + "\"," + "a=\"" + nqa + "\"," + "b=\"" + nqb + "\"," + "c=\"" + nqc + "\"," + "d=\"" + nqd + "\"," + "ans=\"" + nqans + "\"," + "score=\"" + nqscore + "\"where name=\"" + oldqname + "\"";ss = Mque.c_str();if (mysql_query(&mysql, ss)){strcpy_s(sendBuff, "修改題目失敗");send(connectSocket, sendBuff, sizeof(sendBuff), 0);//cout << "修改題目失敗!!" << endl;}else if (mysql_affected_rows(&mysql) == 0){strcpy_s(sendBuff, "需要修改的題目不存在!!");send(connectSocket, sendBuff, sizeof(sendBuff), 0);//cout << "需要修改的題目不存在!!" << endl;return false;}else if (mysql_affected_rows(&mysql) > 0){strcpy_s(sendBuff, "題目修改成功");send(connectSocket, sendBuff, sizeof(sendBuff), 0);}break;}else if (recvBuff[0] == 'A') {string s, sqid, sqname, sqscore;int flag;recv(connectSocket, recvBuff, sizeof(recvBuff), 0);flag = atoi(recvBuff);switch (flag){case 0:s = "select *from que";break;case 1:/*cout << "請輸入題號:" << endl;cin >> sqid;*/recv(connectSocket, recvBuff, sizeof(recvBuff), 0);sqid = recvBuff;s = "select * from que where id ='" + sqid + "'";break;case 2:/*cout << "請輸入題目:" << endl;cin >> sqname;*/recv(connectSocket, recvBuff, sizeof(recvBuff), 0);sqname = recvBuff;s = "select * from que where name = '" + sqname + "'";break;case 3:/*cout << "請輸入分值:" << endl;cin >> sqscore;*/recv(connectSocket, recvBuff, sizeof(recvBuff), 0);sqscore = recvBuff;s = "select * from que where score = '" + sqscore + "'";break;default:break;}const char* ss = s.c_str();mysql_query(&mysql, "set names gbk");mysql_query(&mysql, ss);res = mysql_store_result(&mysql);char field[32][32];for (int i = 0; fd = mysql_fetch_field(res); i++){strcpy_s(field[i], fd->name);}int j = mysql_num_fields(res); //獲取列數strcpy_s(sendBuff, to_string(j).c_str()); //int型轉換成char*型send(connectSocket, sendBuff, sizeof(sendBuff), 0);for (int i = 0; i < j; i++){strcpy_s(sendBuff, field[i]);send(connectSocket, sendBuff, sizeof(sendBuff), 0);//printf("%10s\t", field[i]);}//cout << endl;int k = mysql_num_rows(res);itoa(k, sendBuff, 10);send(connectSocket, sendBuff, sizeof(sendBuff), 0);MYSQL_ROW column;while (column = mysql_fetch_row(res)){for (int i = 0; i < j; i++){strcpy_s(sendBuff, column[i]);send(connectSocket, sendBuff, sizeof(sendBuff), 0);}}break;}elsecontinue;}return 0; } bool ModifyQue() {string nqid, nqname, nqa, nqb, nqc, nqd, nqans, nqscore, oldqname;/*cout << "請輸入需要修改的題目:" << endl;cin >> oldqname;*/recv(connectSocket, recvBuff, sizeof(recvBuff), 0);oldqname = recvBuff;/*cout << "請輸入新的題號:" << endl;cin >> nqid;*/recv(connectSocket, recvBuff, sizeof(recvBuff), 0);nqid = recvBuff;/*cout << "請輸入新的題目:" << endl;cin >> nqname;*/recv(connectSocket, recvBuff, sizeof(recvBuff), 0);nqname = recvBuff;/*cout << "請輸入新的A選項:" << endl;cin >> nqa;*/recv(connectSocket, recvBuff, sizeof(recvBuff), 0);nqa = recvBuff;/*cout << "請輸入新的B選項:" << endl;cin >> nqb;*/recv(connectSocket, recvBuff, sizeof(recvBuff), 0);nqb = recvBuff;/*cout << "請輸入新的C選項:" << endl;cin >> nqc;*/recv(connectSocket, recvBuff, sizeof(recvBuff), 0);nqc = recvBuff;/*cout << "請輸入新的D選項:" << endl;cin >> nqd;*/recv(connectSocket, recvBuff, sizeof(recvBuff), 0);nqd = recvBuff;/*cout << "請輸入新題目的答案:" << endl;cin >> nqans;*/recv(connectSocket, recvBuff, sizeof(recvBuff), 0);nqans = recvBuff;/*cout << "請輸入新題目的分值:" << endl;cin >> nqscore;*/recv(connectSocket, recvBuff, sizeof(recvBuff), 0);nqscore = recvBuff;string Mque = "select *from que where name = \"" + nqname + "\"";const char* ss = Mque.c_str();mysql_query(&mysql, "set names gbk");mysql_query(&mysql, ss);res = mysql_store_result(&mysql);if (mysql_num_rows(res) > 0){strcpy_s(sendBuff, "新題目的名字和表中已存在的題目有重復,修改不成功!");send(connectSocket, sendBuff, sizeof(sendBuff), 0);//cout << "新題目的名字和表中已存在的題目有重復,修改不成功!" << endl;return false;}Mque = "update que set id = \"" + nqid + "\"," + "name=\"" + nqname + "\"," + "a=\"" + nqa + "\"," + "b=\"" + nqb + "\"," + "c=\"" + nqc + "\"," + "d=\"" + nqd + "\"," + "ans=\"" + nqans + "\"," + "score=\"" + nqscore + "\"where name=\"" + oldqname + "\"";ss = Mque.c_str();if (mysql_query(&mysql, ss)){strcpy_s(sendBuff, "修改題目失敗!!");send(connectSocket, sendBuff, sizeof(sendBuff), 0);//cout << "修改題目失敗!!" << endl;return false;}else if (mysql_affected_rows(&mysql) == 0){strcpy_s(sendBuff, "需要修改的題目不存在!!");send(connectSocket, sendBuff, sizeof(sendBuff), 0);//cout << "需要修改的題目不存在!!" << endl;return false;}else if (mysql_affected_rows(&mysql) > 0){strcpy_s(sendBuff, "題目修改成功");send(connectSocket, sendBuff, sizeof(sendBuff), 0);//cout << "題目修改成功" << endl;return true;} }?客戶端(client)
#include "stdafx.h" #include<WinSock2.h> #include<iostream> #include<string> #include<cstring> #pragma comment(lib, "ws2_32.lib") #pragma warning(disable:4996) using namespace std; string logname, logpwd, logall, resmess, rmess; char sendmess[200]; string s, sid, sname, srole, dname; string cid, cname, cpassword, crole; string ssid, sque, sqa, sqb, sqc, sqd, sscore, sanswer; string mname, nid, nname, npassword, nrole; int character = 0;//默認為老師 char recvBuff[200] = { '0' }; char sendBuff[200] = { '0' }; SOCKET clientsocket; HANDLE hMutex; int flag_connect = 1; int j = 0, k = 0; DWORD WINAPI Fun_Recv(LPVOID); DWORD WINAPI Fun_Send(LPVOID); int main(int argc, char* argv[]) { //加載套接字庫WSADATA wsadata;int iRet = WSAStartup(MAKEWORD(2, 2), &wsadata);if (iRet != 0){cout << "套接字庫加載失敗" << endl;return -1;}else{cout << "套接字庫加載成功" << endl;}//創建套接字clientsocket = socket(AF_INET, SOCK_STREAM, 0);if (clientsocket == INVALID_SOCKET){cout << "套接字創建失敗" << endl;return -1;}else{cout << "套接字創建成功" << endl;}//初始化客戶端地址變量SOCKADDR_IN addrSrv;addrSrv.sin_family = AF_INET;addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");addrSrv.sin_port = htons(8000);//連接/綁定iRet = connect(clientsocket, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));if (SOCKET_ERROR == iRet){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);}return 0; } DWORD WINAPI Fun_Send(LPVOID) {string s;while (1) {cout << "************歡迎登錄考試系統*************" << endl;cout << "請輸入賬號:" << endl;cin >> s;logname = s;strcpy_s(sendBuff, logname.c_str());int iRet = send(clientsocket, sendBuff, 200, 0);cout << "請輸入密碼:" << endl;cin >> s;logpwd = s;strcpy_s(sendBuff, logpwd.c_str());send(clientsocket, sendBuff, 200, 0);//向套接字中發送數據ssize_t send(int sockfd, const void *buf, size_t len, int flags); // sockfd:,buf:要發送的數據的首地址len:要發送的數據的字節int flags:設置為MSG_DONTWAITMSG 時 表示非阻塞設置為0時 功能和write一樣recv(clientsocket, recvBuff, 200, 0);//向套接字中發送數據ssize_t recv(int sockfd, const void *buf, size_t len, int flags); cout << recvBuff << endl;if (strcmp(recvBuff, "shibai")){break;}elsecout << "登錄失敗" << endl;}recv(clientsocket, recvBuff, 200, 0);string c = recvBuff;if (c == "2") {character = 1;cout << "你好" << endl;cout << character << endl;}while (true){string s;char flag_out;int flag;cout << "******請輸入接下來的操作*****" << endl;cout << "******1-自定義查詢賬戶*******" << endl;cout << "******2-創建新的賬戶*********" << endl;cout << "******3-創建試卷*************" << endl;cout << "******4-添加試題*************" << endl;cout << "******5-刪除賬號*************" << endl;cout << "******6-修改賬號*************" << endl;cout << "******7-刪除試題*************" << endl;cout << "******8-清除內容*************" << endl;cout << "******9-修改試題*************" << endl;cout << "******A-查看試題*************" << endl;cout << "******0-退出程序*************" << endl;flag_connect = 1;while (flag_connect){cin >> flag_out;flag_connect = 0;}int iRet;sendBuff[0] = flag_out;iRet = send(clientsocket, sendBuff, 200, 0);s = "/0";switch (flag_out){case'1':cout << "請輸入查詢條件" << endl;cout << "0:全部查找" << endl;cout << "1:按學號查找" << endl;cout << "2:按賬號查找" << endl;cout << "3:按身份查找" << endl;flag_connect = 1;while (flag_connect){cin >> flag;flag_connect = 0;}switch (flag){case 0:s = "select * from user";break;case 1:cout << "請輸入您要查找的學號:" << endl;flag_connect = 1;while (flag_connect){cin >> sid;flag_connect = 0;}s = "select * from user where id='" + sid + "'";;break;case 2:cout << "請輸入您要查找的賬號" << endl;flag_connect = 1;while (flag_connect){cin >> sname;flag_connect = 0;}s = "select * from user where role = '" + sname + "'";break;case 3:cout << "請輸入您要查找的身份" << endl;flag_connect = 1;while (flag_connect){cin >> srole;flag_connect = 0;}s = "select * from user where role = '" + srole + "'";;break;}strcpy_s(sendBuff, s.c_str());iRet = send(clientsocket, sendBuff, 200, 0);break;case '2':if (character) {cout << "沒有權限創建學號,請聯系老師" << endl;break;}cout << "請輸入學號:" << endl;flag_connect = 1;while (flag_connect){cin >> cid;flag_connect = 0;}cout << "請輸入要創建的賬號:" << endl;flag_connect = 1;while (flag_connect){cin >> cname;flag_connect = 0;}cout << "請輸入要創建的密碼:" << endl;flag_connect = 1;while (flag_connect){cin >> cpassword;flag_connect = 0;}cout << "請輸入要創建的角色:" << endl;flag_connect = 1;while (flag_connect){cin >> crole;flag_connect = 0;}s = "insert into user VALUES('" + cid + "','" + cname + "','" + cpassword + "','" + crole + "')";strcpy_s(sendBuff, s.c_str());iRet = send(clientsocket, sendBuff, 200, 0);recv(clientsocket, recvBuff, 200, 0);if (recvBuff[0] == '1')cout << "創建成功" << endl;elsecout << "創建失敗" << endl;break;case '3':cout << "請輸入題目數量:" << endl;flag_connect = 1;while (flag_connect){cin >> s;flag_connect = 0;}strcpy_s(sendBuff, s.c_str());iRet = send(clientsocket, sendBuff, 200, 0);for (int i = 0; i < atoi(s.c_str()); i++){recv(clientsocket, recvBuff, 200, 0);cout << recvBuff << endl;recv(clientsocket, recvBuff, 200, 0);cout << recvBuff << endl;}cout << "標準答案:" << endl;flag_connect = 1;while (flag_connect){cin >> s;flag_connect = 0;}strcpy_s(sendBuff, s.c_str());iRet = send(clientsocket, sendBuff, 200, 0);recv(clientsocket, recvBuff, 200, 0);cout << "你的成績是:" << recvBuff << endl;break;case '4':if (character) {cout << "無權利創建試題,請聯系老師" << endl;break;}cout << "請輸入題號:" << endl;flag_connect = 1;while (flag_connect){cin >> ssid;flag_connect = 0;}cout << "請輸入題目:" << endl;flag_connect = 1;while (flag_connect){cin >> sque;flag_connect = 0;}cout << "請輸入A選項:" << endl;flag_connect = 1;while (flag_connect){cin >> sqa;flag_connect = 0;}cout << "請輸入B選項:" << endl;flag_connect = 1;while (flag_connect){cin >> sqb;flag_connect = 0;}cout << "請輸入C選項:" << endl;flag_connect = 1;while (flag_connect){cin >> sqc;flag_connect = 0;}cout << "請輸入D選項:" << endl;flag_connect = 1;while (flag_connect){cin >> sqd;flag_connect = 0;}cout << "請輸入該題答案:" << endl;flag_connect = 1;while (flag_connect){cin >> sanswer;flag_connect = 0;}cout << "請輸入分數:" << endl;flag_connect = 1;while (flag_connect){cin >> sscore;flag_connect = 0;}s = "insert into que VALUES('" + ssid + "','" + sque + "','" + sqa + "','" + sqb + "','" + sqc + "','" + sqd + "','" + sanswer + "','" + sscore + "')";strcpy_s(sendBuff, s.c_str());iRet = send(clientsocket, sendBuff, 200, 0);recv(clientsocket, recvBuff, 200, 0);if (recvBuff[0] == '1')cout << "創建成功" << endl;elsecout << "創建失敗" << endl;break;case '5':if (character) {cout << "無權利刪除用戶,請聯系老師" << endl;break;}cout << "請輸入要刪除的用戶名:" << endl;flag_connect = 1;while (flag_connect){cin >> dname;flag_connect = 0;}s = "delete from user where name='" + dname + "'";strcpy_s(sendBuff, s.c_str());iRet = send(clientsocket, sendBuff, 200, 0);recv(clientsocket, recvBuff, 200, 0);if (recvBuff[0] == '1')cout << "刪除成功" << endl;elsecout << "刪除失敗" << endl;break;case '6':cout << "請輸入要修改的賬號:" << endl;flag_connect = 1;while (flag_connect){cin >> mname;flag_connect = 0;}cout << "請輸入新的ID:" << endl;flag_connect = 1;while (flag_connect){cin >> nid;flag_connect = 0;}cout << "請輸入新的賬號:" << endl;flag_connect = 1;while (flag_connect){cin >> nname;flag_connect = 0;}cout << "請輸入新的密碼:" << endl;flag_connect = 1;while (flag_connect){cin >> npassword;flag_connect = 0;}cout << "請輸入新的角色:" << endl;flag_connect = 1;while (flag_connect){cin >> nrole;flag_connect = 0;}s = "update user set id='" + nid + "'," + " name='" + nname + "'," + " pwd='" + npassword + "'," + " role='" + nrole + "' where name='" + mname + "'";strcpy_s(sendBuff, s.c_str());iRet = send(clientsocket, sendBuff, 200, 0);recv(clientsocket, recvBuff, 200, 0);if (recvBuff[0] == '1')cout << "修改成功" << endl;elsecout << "修改失敗" << endl;break;case '7':if (character) {cout << "無權利刪除試題,請聯系老師" << endl;break;}cout << "請輸入要刪除的試題id:" << endl;flag_connect = 1;while (flag_connect){cin >> dname;flag_connect = 0;}s = "delete from que where id='" + dname + "'";strcpy_s(sendBuff, s.c_str());iRet = send(clientsocket, sendBuff, 200, 0);recv(clientsocket, recvBuff, 200, 0);if (recvBuff[0] == '1')cout << "刪除成功" << endl;elsecout << "刪除失敗" << endl;break;case '8':system("cls");break;case '9':cout << "請輸入需要修改的題目:" << endl;flag_connect = 1;while (flag_connect){cin >> sendBuff;flag_connect = 0;}send(clientsocket, sendBuff, sizeof(sendBuff), 0);cout << "請輸入新的題號:" << endl;flag_connect = 1;while (flag_connect){cin >> sendBuff;flag_connect = 0;}send(clientsocket, sendBuff, sizeof(sendBuff), 0);cout << "請輸入新的題目:" << endl;flag_connect = 1;while (flag_connect){cin >> sendBuff;flag_connect = 0;}send(clientsocket, sendBuff, sizeof(sendBuff), 0);cout << "請輸入新的A選項:" << endl;flag_connect = 1;while (flag_connect){cin >> sendBuff;flag_connect = 0;}send(clientsocket, sendBuff, sizeof(sendBuff), 0);cout << "請輸入新的B選項:" << endl;flag_connect = 1;while (flag_connect){cin >> sendBuff;flag_connect = 0;}send(clientsocket, sendBuff, sizeof(sendBuff), 0);cout << "請輸入新的C選項:" << endl;flag_connect = 1;while (flag_connect){cin >> sendBuff;flag_connect = 0;}send(clientsocket, sendBuff, sizeof(sendBuff), 0);cout << "請輸入新的D選項:" << endl;flag_connect = 1;while (flag_connect){cin >> sendBuff;flag_connect = 0;}send(clientsocket, sendBuff, sizeof(sendBuff), 0);cout << "請輸入新題目的答案:" << endl;flag_connect = 1;while (flag_connect){cin >> sendBuff;flag_connect = 0;}send(clientsocket, sendBuff, sizeof(sendBuff), 0);cout << "請輸入新題目的分值:" << endl;flag_connect = 1;while (flag_connect){cin >> sendBuff;flag_connect = 0;}send(clientsocket, sendBuff, sizeof(sendBuff), 0);recv(clientsocket, recvBuff, sizeof(recvBuff), 0);cout << recvBuff << endl;cout << endl;break;break;case '0':return 0;case 'A':cout << "全部查詢,請輸入0" << endl;cout << "按題號查詢,請輸入1" << endl;cout << "按題目查詢,請輸入2" << endl;cout << "按分值查詢,請輸入3\n" << endl;cout << "請輸入查詢條件:" << endl;flag_connect = 1;while (flag_connect){cin >> sendBuff;flag_connect = 0;}send(clientsocket, sendBuff, sizeof(sendBuff), 0);cout << endl;int flag;flag = atoi(sendBuff);switch (flag){case 0://s = "select *from user";break;case 1:cout << "請輸入題號:" << endl;flag_connect = 1;while (flag_connect){cin >> sendBuff;flag_connect = 0;}send(clientsocket, sendBuff, sizeof(sendBuff), 0);//s = "select * from user where id ='" + sid + "'";break;case 2:cout << "請輸入題目:" << endl;flag_connect = 1;while (flag_connect){cin >> sendBuff;flag_connect = 0;}send(clientsocket, sendBuff, sizeof(sendBuff), 0);/*sname = recvBuff;s = "select * from user where name = '" + sname + "'";*/break;case 3:cout << "請輸入分值:" << endl;flag_connect = 1;while (flag_connect){cin >> sendBuff;flag_connect = 0;}send(clientsocket, sendBuff, sizeof(sendBuff), 0);/*srole = recvBuff;s = "select * from user where rol = '" + srole + "'";*/break;default:break;}recv(clientsocket, recvBuff, sizeof(recvBuff), 0);j = 0;k = 0;j = atoi(recvBuff); //將char*型轉換成int型for (int i = 0; i < j; i++) //打印字段{recv(clientsocket, recvBuff, sizeof(recvBuff), 0);printf("%10s\t", recvBuff);}cout << endl;recv(clientsocket, recvBuff, sizeof(recvBuff), 0);k = atoi(recvBuff);for (int n = 0; n < k; n++){for (int i = 0; i < j; i++) //打印字段{recv(clientsocket, recvBuff, sizeof(recvBuff), 0);printf("%10s\t", recvBuff);}cout << endl;cout << endl;}default:cout << "請輸入正確指令:" << endl;break;}}return 0; }5,分別放入cpp文件之后,你會遇到這樣的報錯,關于預編譯頭文件“stdafx.h”的錯誤
?這時候需要手動配置一下頭文件
6,新建stdafx.h頭文件,內容如下(如果不成功,推薦百度下載)
// stdafx.h : include file for standard system include files, // or project specific include files that are used frequently, but // are changed infrequently //#if !defined(AFX_STDAFX_H__4607A810_33E2_483D_80D8_BE41F0D473D5__INCLUDED_) #define AFX_STDAFX_H__4607A810_33E2_483D_80D8_BE41F0D473D5__INCLUDED_#if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000// Insert your headers here #define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers #define DLLEXPORT __declspec(dllexport) #define DLLIMPORT __declspec(dllimport)#include "stdio.h" #include <windows.h> #include <winsock2.h> #include <ws2tcpip.h>#pragma comment(lib,"ws2_32.lib")// TODO: reference additional headers your program requires here void Msg(char* szFormat, ...); void dbMsg(char* szFormat, ...); //{{AFX_INSERT_LOCATION}} // Microsoft Visual C++ will insert additional declarations immediately before the previous line.#endif // !defined(AFX_STDAFX_H__4607A810_33E2_483D_80D8_BE41F0D473D5__INCLUDED_)7,全部完成之后,需要注意幾點
(1)server文件里面你和我的mysql密碼賬號不同,需要自行修改。
(2)表頭不一樣,這個很重要,我的表頭是,但你的可能是passward等不同的名稱,需要對mysql里面的內容進行修改,試題的表頭我是que,你們可能是question,這個需要注意。
?
(3)還是mysql的問題,需要對身份role進行修改,教師改為“t”,學生改為“s”;這里建議直接刪掉全部重新改。
8,所有的全部進行完,基本就沒有問題了,可以開始運行,這里切記,先運行server文件,再運行client文件,這個順序一亂就會出錯。
顯示結果
服務器:
客戶端:
9,接下來的操作自己對照著自己的mysql里面的user和que進行操作就好了。
10,最后,這個代碼和老師的有出入,僅供學習操作使用!
?
?
?
總結
以上是生活随笔為你收集整理的VS+MYSQL考试管理系统(白piao速成版)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ACM/ICPC 比赛生涯总结+经验分享
- 下一篇: PPT和回放来了 | 中国Postgre