基于CS架构的考试系统

服务端:

#include<stdio.h>
#include<string>
#include<iostream>
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include <conio.h>
#include<ctime>
#include<set>
#include<stdlib.h>
#include<WinSock2.h>
#include<ctime>
#include<mysql.h>
using namespace std;
#pragma comment(lib,"libmysql.lib")
#pragma comment(lib,"wsock32.lib")
MYSQL mysql;//定义mysql是起一个连接数据库作用,它是连接c++和数据库的枢纽;
MYSQL_RES* res;//定义结果集,它的作用是收集mysql_query的结果
int flag_connect = 1;
int cont = 0;
SOCKET connectSocket;
char recvBuff[200];
char sendBuff[255];
SOCKET serverSocket;
HANDLE hMutex;
MYSQL_ROW row;
bool connectdatabase()//连数据库函数
{
	mysql_init(&mysql);//初始化mysql;
	if (!(mysql_real_connect(&mysql, "localhost", "root", "20190608", "test", 3306, NULL, 0)))/*连接数据库 第一个参数是已定义MYSQL结构体的地址。
		第二个参数host是MYSQL服务器的地址或主机名。如果主机名是NULL或是“localhost”,则会连接本机。
		第三个参数user是MYSQL登陆ID。
		第四个参数passwd是MYSQL登陆密码。
		第五个参数db是要连接的数据库。
		第六个参数port是服务器的TCP服务端口
		第七个参数unix_socket–unix连接方式,为NULL时表示不使用socket或管道机制。
		第八个参数clientflag一般取0。连接失败时该函数返回0*/
	{
		printf("ERROR connecting to database:%s\n", mysql_error(&mysql));//输出错误信心;
		return false;
	}
	else
	{
		printf("connected...\n");//连接成功
		return true;
	}

}
void FreeConnect()
{
	//释放资源
	mysql_free_result(res);//释放结果集
	mysql_close(&mysql);//关闭mysql;关闭前面已经打开的连接。
}
void zhuxiao()
{
	char str[200], str1[20], str2[100];
	send(connectSocket, "请输入要注销的账号", sizeof(sendBuff), 0);
	while (strcmp(recvBuff, "4") == 0 || strcmp(recvBuff, str) == 0);
	strcpy_s(str, recvBuff);
	strcpy_s(str1, str);
	sprintf_s(str2, "select * from user where name='%s'", str1);
	if (mysql_query(&mysql, str2))
	{
		printf("查询失败,%d : %s\n", mysql_errno(&mysql), mysql_error(&mysql));
	}
	else
	{
		MYSQL_ROW row;
		res = mysql_store_result(&mysql);
		uint64_t rows = mysql_num_rows(res);
		if (rows == 0)
		{
			send(connectSocket, "用户不存在\n", sizeof(sendBuff), 0);
			
		}
		else
		{
			send(connectSocket, "请输入要注销账号的密码:\n", sizeof(sendBuff), 0);
			while (strcmp(recvBuff, "4") == 0 || strcmp(recvBuff, str) == 0);
			strcpy_s(str, recvBuff);
			strcpy_s(str2, str);
			int flag = 0;
			while (row = mysql_fetch_row(res))
			{
				if (strcmp(row[1], str2) == 0)
				{
					flag = 1;
					send(connectSocket, "确认要注销此账号吗?\n", sizeof(sendBuff), 0);
					send(connectSocket, "确认请按1\n", sizeof(sendBuff), 0);
					send(connectSocket, "返回请按2\n", sizeof(sendBuff), 0);
					while (strcmp(recvBuff, "4") == 0 || strcmp(recvBuff, str) == 0);
					strcpy_s(str, recvBuff);

					if (strcmp(str, "1") == 0)
					{

						sprintf_s(str, "delete from user where name='%s'and password='%s'", str1, str2);
						//cout << cstr;
						if (mysql_query(&mysql, str))
						{
							printf("delete faild %d : %s\n", mysql_errno(&mysql), mysql_error(&mysql));

						}
						else
						{
							
							send(connectSocket, "刪除成功\n", sizeof(sendBuff), 0);
						}
					}
					break;
				}

			}

			if (!flag)
				send(connectSocket, "密码错误\n", sizeof(sendBuff), 0);
		}
		}
		mysql_free_result(res);
	return;
}
void chuangjian()
{
	char str[200], str1[200], str2[20], str3[23], str4[20], str5[20], str6[20];
	send(connectSocket, "请输入您的账号\n", sizeof(recvBuff), 0);
	while (1)
	{
		while (strcmp(recvBuff, "2") == 0 || strcmp(str, recvBuff) == 0);
		strcpy_s(str, recvBuff);
		strcpy_s(str6, recvBuff);
		sprintf_s(str1, "select * from user where name='%s'", str6);
		cout << str1;
		if (mysql_query(&mysql, str1))
		{
			printf("查询失败,%d : %s\n", mysql_errno(&mysql), mysql_error(&mysql));
		}
		else
		{
			res = mysql_store_result(&mysql);
			uint64_t rows = mysql_num_rows(res);
			if (rows != 0)
			{
				send(connectSocket, "您的账号已存在,请重新输入:\n", sizeof(recvBuff), 0);
				Sleep(100);
			}
			else
			{
				break;
			}
		}
		
	}
	
	while (1)
	{
		send(connectSocket, "请输入您的密码\n", sizeof(recvBuff), 0);
		while (strcmp(str, recvBuff) == 0);
		strcpy_s(str, recvBuff);
		strcpy_s(str1, recvBuff);
		int flag = 0, flag1 = 0, flag2 = 0, flag3 = 0;
		for (int i = 0; i < strlen(recvBuff); i++)
		{
			if (recvBuff[i] >= '0' && recvBuff[i] <= '9')
			{
				flag = 1;
			}
			if (recvBuff[i] >= 'a' && recvBuff[i] <= 'z')
			{
				flag1 = 1;
			}
			else if (recvBuff[i] >= 'A' && recvBuff[i] <= 'Z')
			{
				flag2 = 1;
			}
			else
			{
				flag3 = 1;
			}
		}
		int sum = flag + flag1 + flag2 + flag3;
		if (sum < 3)
		{
			send(connectSocket, "注意:您的密码安全系数过低,请重新设置密码\n", sizeof(recvBuff), 0);
		}
		else
		{
			send(connectSocket, "密码设置成功\n", sizeof(recvBuff), 0);
			break;
		}
	}
	send(connectSocket, "请输入您的学号:\n", sizeof(recvBuff), 0);
	while (strcmp(str, recvBuff) == 0);
	strcpy_s(str, recvBuff);
	strcpy_s(str2, recvBuff);
	send(connectSocket, "请输入您的手机号:\n ", sizeof(recvBuff), 0);
	while (strcmp(str, recvBuff) == 0);
	strcpy_s(str, recvBuff);
	strcpy_s(str3, recvBuff);
	send(connectSocket, "请输入您的邮箱:\n", sizeof(recvBuff), 0);
	while (strcmp(str, recvBuff) == 0);
	strcpy_s(str, recvBuff);
	strcpy_s(str4, recvBuff);
	send(connectSocket, "请输入您的身份:\n", sizeof(recvBuff), 0);
	while (strcmp(str, recvBuff) == 0);
	strcpy_s(str, recvBuff);
	strcpy_s(str5, recvBuff);
	sprintf_s(str, "insert into user values('%s','%s','%d','%s','%s','%s')", str6, str1, atoi(str2), str3, str4, str5);
	cout << str;
	if (mysql_query(&mysql, str))
	{
		printf("添加用户失败 %d : %s\n", mysql_errno(&mysql), mysql_error(&mysql));
	}
	else
	{
		send(connectSocket, "注册成功\n", sizeof(recvBuff), 0);
	}
	mysql_free_result(res);
	return;
}
void addexam()
{
	char examtotal[20], title[20], a[20], b[20], c[20], d[20], ans[20], score[20],str[200];
	send(connectSocket, "请输入题目编号:", sizeof(recvBuff), 0);
	while (strcmp(recvBuff, "1") == 0 || strcmp(str, recvBuff) == 0);
	strcpy_s(str, recvBuff);
	strcpy_s(examtotal, str);
	send(connectSocket, "请输入题目:", sizeof(recvBuff), 0);
	while (strcmp(recvBuff, "1") == 0 || strcmp(str, recvBuff) == 0);
	strcpy_s(str, recvBuff);
	strcpy_s(title, recvBuff);
	send(connectSocket, "请输入A选项:", sizeof(recvBuff), 0);
	while (strcmp(recvBuff, "1") == 0 || strcmp(str, recvBuff) == 0);
	strcpy_s(str, recvBuff);
	strcpy_s(a, str);
	send(connectSocket, "请输入B选项:", sizeof(recvBuff), 0);
	while (strcmp(recvBuff, "1") == 0 || strcmp(str, recvBuff) == 0);
	strcpy_s(str, recvBuff);
	strcpy_s(b, str);
	send(connectSocket, "请输入C选项:", sizeof(recvBuff), 0);
	while (strcmp(recvBuff, "1") == 0 || strcmp(str, recvBuff) == 0);
	strcpy_s(str, recvBuff);
	strcpy_s(c, str);
	send(connectSocket, "请输入D选项:", sizeof(recvBuff), 0);
	while (strcmp(recvBuff, "1") == 0 || strcmp(str, recvBuff) == 0);
	strcpy_s(str, recvBuff);
	strcpy_s(d, str);
	send(connectSocket, "请输入正确选项:", sizeof(recvBuff), 0);
	while (strcmp(recvBuff, "1") == 0 || strcmp(str, recvBuff) == 0);
	strcpy_s(str, recvBuff);
	strcpy_s(ans, str);
	send(connectSocket, "请输入分值:", sizeof(recvBuff), 0);
	while (strcmp(recvBuff, "1") == 0 || strcmp(str, recvBuff) == 0);
	strcpy_s(str, recvBuff);
	strcpy_s(score, str);
	char query[200];
	sprintf_s(query, "insert into exam values('%d','%s','%s','%s','%s','%s','%s','%s');", atoi(examtotal), title, a, b, c, d,ans,score);
	cout << query<<endl;
	if (mysql_query(&mysql, query))
	{
		printf("添加失败 %d : %s\n", mysql_errno(&mysql), mysql_error(&mysql));
	}
	else
	{
		send(connectSocket, "添加成功\n", sizeof(recvBuff), 0);
	}
	return;
}
void update()
{
	char name[20], nname[20], role[20], telephone[20], password[20], mail[20], str[200];
	send(connectSocket,"请输入要修改的账号", sizeof(sendBuff), 0);
	while (strcmp(recvBuff, "3") == 0 || strcmp(recvBuff, str) == 0);
	strcpy_s(str, recvBuff);
	strcpy_s(name, str);
	Sleep(100);
	send(connectSocket, "请输入新的账号", sizeof(sendBuff), 0);
	while (strcmp(recvBuff, "3") == 0 || strcmp(recvBuff, str) == 0);
	strcpy_s(str, recvBuff);
	strcpy_s(nname, str);
	Sleep(100);
	send(connectSocket, "请输入新的密码", sizeof(sendBuff), 0);
	while (strcmp(recvBuff, "3") == 0 || strcmp(recvBuff, str) == 0);
	strcpy_s(str, recvBuff);
	strcpy_s(password, str);
	Sleep(100);
	send(connectSocket, "请输入新的手机号", sizeof(sendBuff), 0);
	while (strcmp(recvBuff, "3") == 0 || strcmp(recvBuff, str) == 0);
	strcpy_s(str, recvBuff);
	strcpy_s(telephone, str);
	Sleep(100);
	send(connectSocket, "请输入新的邮箱", sizeof(sendBuff), 0);
	while (strcmp(recvBuff, "3") == 0 || strcmp(recvBuff, str) == 0);
	strcpy_s(str, recvBuff);
	strcpy_s(mail, str);
	Sleep(100);
	send(connectSocket, "请输入新的身份", sizeof(sendBuff), 0);
	while (strcmp(recvBuff, "3") == 0 || strcmp(recvBuff, str) == 0);
	strcpy_s(str, recvBuff);
	strcpy_s(role, str);
	Sleep(100);
	sprintf_s(str, "update user set name='%s',password='%s',tel='%s',mail='%s',role='%s' where name='%s'", nname, password, telephone, mail, role, name);
	if (mysql_query(&mysql, str))
	{
		printf("修改失败 %d : %s", mysql_errno(&mysql), mysql_error(&mysql));
	}
	else
	{
		send(connectSocket, "更改成功\n", sizeof(sendBuff), 0);
	}
}
void selectuser()
{
	char str1[200], str[20];
	int flag;
	strcpy_s(str, recvBuff);
	send(connectSocket, "请输入查询条件:", sizeof(recvBuff), 0);
	cont = 0;
	while (cont == 0);
	strcpy_s(str, recvBuff);
	switch (atoi(str))
	{
	case 1:send(connectSocket, "请输入您要查找学号", sizeof(recvBuff), 0);
		cont = 0;
		while (cont == 0);
		strcpy_s(str, recvBuff);
		sprintf_s(str1, "select * from user where id='%d';", atoi(str));
		break;
	case 2:
		send(connectSocket, "请输入您要查找的账号", sizeof(recvBuff), 0);
		while (strcmp(recvBuff, str) == 0);
		strcpy_s(str, recvBuff);
		sprintf_s(str1, "select * from user where name='%s'", str);
		break;
	case 3:
		send(connectSocket, "请输入您要查找的身份", sizeof(recvBuff), 0);
		while (strcmp(recvBuff, str) == 0);
		strcpy_s(str, recvBuff);
		sprintf_s(str1, "select * from user where role='%s'", str);
		break;
	case 4:
		send(connectSocket, "请输入您要查找的手机号", sizeof(recvBuff), 0);
		while (strcmp(recvBuff, str) == 0);
		strcpy_s(str, recvBuff);
		sprintf_s(str1, "select * from user where tel='%s'", str);
		break;
	case 5:
		send(connectSocket, "请输入您要查找的邮箱", sizeof(recvBuff), 0);
		while (strcmp(recvBuff, str) == 0);
		strcpy_s(str, recvBuff);
		sprintf_s(str1, "select * from user where mail='%s'", str);
		break;
	}
	if (mysql_query(&mysql, str1) == 0)
	{
		res = mysql_store_result(&mysql);
		if (res)
		{
			MYSQL_FIELD* field;
			while ((field = mysql_fetch_field(res)))
			{
				sprintf_s(str1,"%s   ", field->name);
				send(connectSocket, str1, sizeof(str1), 0);
				Sleep(100);
			}
			send(connectSocket, "\n", sizeof(str1), 0);
			Sleep(100);
			printf("\n\n");
			MYSQL_ROW row;
			unsigned int cols = mysql_num_fields(res);
			int flag1 = 1;
			while ((row = mysql_fetch_row(res)) != NULL)
			{
				 flag1 = 0;
				for (unsigned int i = 0; i < cols; ++i)
				{
					sprintf_s(str1,"%s     ", row[i]);
					send(connectSocket, str1, sizeof(str1), 0);
					Sleep(100);
				}
				send(connectSocket, "\n", sizeof(str1), 0);
				Sleep(100);
			}
			if (flag1)
			{
				cout << "没有查询到任何用户\n" << endl;
					send(connectSocket, "没有查询到任何用户\n", sizeof(str1), 0);
			}
		}
		else
		{
			printf("use result failed %d : %s\n", mysql_errno(&mysql), mysql_error(&mysql));
		}
	}
	else
	{
		printf("query result failed %d : %s\n", mysql_errno(&mysql), mysql_error(&mysql));
	}
	return;
}
void createexam()
{
	int flag=0, a[1000], sum = 0;
	char str[250];
	send(connectSocket, "请设置题目数量:\n", sizeof(recvBuff), 0);
	cont = 0;
	while (cont == 0);
	strcpy_s(str, recvBuff);
	for (int i = 0; i < strlen(str); i++)//获取输入的数字
	{
		flag = flag * 10 + str[i] - '0';
	}
	char str1[50] = "select * from exam";
	char A[200], B[200], C[200], D[200], title[200];
	char ans[200];
	mysql_query(&mysql, str1);
	res = mysql_store_result(&mysql);
	uint64_t rows = mysql_num_rows(res);
	srand(time(0));
	set<int>s;
	for (int i = 0; i < flag; i++)
	{
		int x = rand() % rows + 1;
		if (s.count(x))
			i--;
		else
		{
			s.insert(x);
			a[i] = x;
		}
	}
	for (int i = 0; i < flag; i++)
	{
		sprintf_s(str1, "select * from exam where id='%d';", a[i]);

		if (mysql_query(&mysql, str1))
		{
			printf("查询失败 %d : %s", mysql_errno(&mysql), mysql_error(&mysql));
		}
		else
		{
			res = mysql_store_result(&mysql);
			MYSQL_ROW row;
			row = mysql_fetch_row(res);
			strcpy_s(title, row[1]);
			strcpy_s(A, row[2]);
			strcpy_s(B, row[3]);
			strcpy_s(C, row[4]);
			strcpy_s(D, row[5]);
			strcpy_s(ans, row[6]);
			string v = to_string(i + 1);
			const char* l;
			l = v.c_str();
			send(connectSocket, l, sizeof(str), 0);
			Sleep(100);
			send(connectSocket, ")\n", sizeof(str), 0);
			Sleep(100);
			send(connectSocket, title, sizeof(str), 0);
			Sleep(100);
			send(connectSocket, "\n", sizeof(str), 0);
			Sleep(100);
			send(connectSocket, "A.", sizeof(str), 0);
			Sleep(100);
			send(connectSocket, A, sizeof(str), 0);
			Sleep(100);
			send(connectSocket, "\n", sizeof(str), 0);
			Sleep(100);
			send(connectSocket, "B.", sizeof(str), 0);
			Sleep(100);
			send(connectSocket, B, sizeof(str), 0);
			Sleep(100);
			send(connectSocket, "\n", sizeof(str), 0);
			Sleep(100);
			send(connectSocket, "C.", sizeof(str), 0);
			Sleep(100);
			send(connectSocket, C, sizeof(str), 0);
			Sleep(100);
			send(connectSocket, "\n", sizeof(str), 0);
			Sleep(100);
			send(connectSocket, "D.", sizeof(str), 0);
			Sleep(100);
			send(connectSocket, D, sizeof(str), 0);
			Sleep(100);
			send(connectSocket, "\n", sizeof(str), 0);
			Sleep(100);
			send(connectSocket, "请输入正确答案\n", sizeof(str), 0);
			Sleep(100);
			int j=0;
			for (int z = 0; z < strlen(row[7]); z++)
			{
				j = j * 10 + row[7][z] - '0';
			}
			cout << row[7] << "   " << j << endl;
			cont = 0;
			while (cont == 0);
			strcpy_s(str, recvBuff);
			if (strcmp(str,ans)==0 )
				sum += j;
		}
	}
	char u[200];
	cout << sum;
	sprintf_s(u, "您总共获得%d分\n", sum);
	send(connectSocket,u, sizeof(str), 0);
}
void login()
{
	char str[20], str3[200];
	send(connectSocket, "请输入您的账号\n", sizeof(recvBuff), 0);
	while (1)
	{
		while (strcmp(recvBuff, "1") == 0 || strcmp(str, recvBuff) == 0);
		strcpy_s(str, recvBuff);
		sprintf_s(str3, "select * from user where name='%s'", recvBuff);
		mysql_query(&mysql, str3);;//定义变量来存储每一行的结果
		res = mysql_store_result(&mysql);//res来存放结果集
		uint64_t rows = mysql_num_rows(res);//从结果集里面获取每一行的内容
		if (rows == 0)
		{
			send(connectSocket, "用户不存在\n", sizeof(recvBuff), 0);
			send(connectSocket, "请输入您的账号\n", sizeof(recvBuff), 0);
		}
		else
		{
			break;
		}
	}
	send(connectSocket, "请输入密码\n", sizeof(recvBuff), 0);
	while (1)
	{
		int flag = 0;
		mysql_query(&mysql, str3);
		res = mysql_store_result(&mysql);
		while (strcmp(recvBuff, "1") == 0 || strcmp(str, recvBuff) == 0);
		strcpy_s(str, recvBuff);
		while (row = mysql_fetch_row(res))
		{
			if (strcmp(recvBuff, row[1]) == 0)//判断获取结果的密码字段与输入的密码是否相相同;
			{
				flag = 1;
				send(connectSocket, "登录成功\n", sizeof(recvBuff), 0);
				Sleep(1000);
				if (strcmp(row[5], "1") == 0)
				{
					char f[200] = "您的身份是老师\n";
					send(connectSocket, f, sizeof(f), 0);
					Sleep(100);
					while (1)
					{
						send(connectSocket, "您可以执行如下操作:\n", sizeof(f), 0);
						int flag = 1;
						cont = 0;
						while (cont == 0);
						strcpy_s(str, recvBuff);
						switch (atoi(str))
						{
						case 1:
							addexam();
							break;
						case 2:
							selectuser();
							break;
						case 3:update();
							break;
						case 4:
							zhuxiao();
							break;
						case 5:flag = 0;
							break;
						default:
							strcpy_s(f, "只能输入1-5内的数字\n");
							send(connectSocket, f, sizeof(f), 0);
							break;
						}
						if (!flag)
							break;
						else
						{
							Sleep(100);
							send(connectSocket, "按下任意键返回选项\n", sizeof(f), 0);
							cont = 0;
							while (cont==0);
						
						}
					}
				}
				else
				{
					send(connectSocket, "您的身份是学生\n", sizeof(recvBuff), 0);
					Sleep(100);
					send(connectSocket, "您可以執行以下操作\n", sizeof(recvBuff), 0);
					Sleep(100);
					send(connectSocket, "是否生成試卷?(按1进行生成试卷,按其余键退出)\n", sizeof(recvBuff), 0);
					cont = 0;
					while (cont == 0);
					strcpy_s(str, recvBuff);
					if (strcmp(recvBuff, "1") == 0)
					{
						createexam();
					}
					
						exit(0);
				}
				
				break;
			}
		}
		if (!flag)
		{
			send(connectSocket, "密码错误\n", sizeof(recvBuff), 0);
			send(connectSocket, "请重新输入密码\n", sizeof(recvBuff), 0);
		}
		else
			break;
	}
	return;
}
void menu()//
{
	int k = 0;
	while (1)
	{
		cont = 0;//cont是判断是否输入新的字符串
		while (cont == 0);//如果变成1就是输入好了已经;
		switch (atoi(recvBuff))//变成数字
		{
		case 1:
			login();
			break;
		case 2:k = 1;
			chuangjian();
			break;
		}
		if (k)
			break;
	}
	return;
}
DWORD WINAPI Fun_Recv(LPVOID);
DWORD WINAPI Fun_Send(LPVOID);
int main()
{
	connectdatabase();//连接数据库
	mysql_query(&mysql, "set names gbk");//转成gbk编码,支持中文存储;
	//createexam();
	WSADATA wsaData;//定义变量
	int iRet = 0;
	iRet = WSAStartup(MAKEWORD(2, 2), &wsaData);//绑定2.2版本的套接字库
	//LOBYTE()取得16进制数最低位;HIBYTE()取得16进制数最高(最左边)那个字节的内容 
	if (2 != LOBYTE(wsaData.wVersion) || 2 != HIBYTE(wsaData.wVersion))
	{
		WSACleanup(); //没有绑定对版本,要调用WSACleanup函数来解除与Socket库的绑定并且释放Socket库所占用的系统资源。
		cout << "WSADATA version is not correct!" << 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("172.30.88.74");//ip地址
	addrSrv.sin_family = AF_INET;//定义协议族
	addrSrv.sin_port = htons(6000);///绑定端口
	iRet = bind(serverSocket, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));//绑定地址族
	if (iRet == SOCKET_ERROR)
	{
		cout << "绑定失败" << endl;
		return -1;
	}
	else
	{
		cout << "绑定成功" << endl;
	}
	iRet = listen(serverSocket, 10);//监听套接字serverSocket
	if (iRet == SOCKET_ERROR)
	{
		cout << "开启监听失败" << endl;
		return -1;
	}
	else
	{
		cout << "开启监听成功" << endl;
	}
	SOCKADDR_IN clientAddr;
	int len = sizeof(SOCKADDR);
	connectSocket = accept(serverSocket, (SOCKADDR*)&clientAddr, &len);//连接套接字
	if (INVALID_SOCKET == connectSocket)
	{
		cout << "接受连接失败" << endl;
		return -1;
	}
	else
	{
		cout << "接受连接成功" << endl;
	}
	char recvadta[1024] = { 0 };
	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");//创建互斥量,互斥量可以限制线程,不允许所有线程同时进行;
	int i = 0;
	menu();
	return 0;
} 
DWORD WINAPI Fun_Send(LPVOID)
{
	while (flag_connect)
	{

		cin >> sendBuff;
		int iRet = send(connectSocket, sendBuff, sizeof(sendBuff), 0);
		if (iRet <= 0)
		{
			cout << "发送线程关闭连接" << endl;
			flag_connect = 0;
			return -1;
		}
	}
	return 0;
}
DWORD WINAPI Fun_Recv(LPVOID)
{
	while (flag_connect)
	{

		int iRet = recv(connectSocket, recvBuff, 255, 0);
		if (iRet <= 0)
		{
			cout << "接受线程关闭连接" << endl;
			closesocket(serverSocket);
			WSACleanup();
			flag_connect = 0;
			return -1;
		}
		else
		{
			cont = 1;
			cout << recvBuff << endl;
		}
	}
	return 0;
}

客户端:

#include<conio.h>
#include<iostream >
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include<WinSock2.h>
using namespace std;
#pragma comment(lib,"wsock32.lib")
int flag_connect = 1;
char sendBuff[255];
char recvBuff[255];
SOCKET cilent;
HANDLE hMutex;
DWORD WINAPI Fun_Recv(LPVOID);
DWORD WINAPI Fun_Send(LPVOID);
void menu()
{
	int k = 0;
	system("cls");
	
		cout << "****欢迎进入考试管理系统****" << endl;
		cout << "****按1进行登录****" << endl;
		cout << "****按2进行注册****" << endl;
		cout << "****按3进行退出考试系统****" << endl;

	while (1);
}
int main()
{
	WSADATA wsaData;
	int iRet = 0;
	iRet = WSAStartup(MAKEWORD(2, 2), &wsaData);
	//LOBYTE()取得16进制数最低位;HIBYTE()取得16进制数最高(最左边)那个字节的内容 
	if (2 != LOBYTE(wsaData.wVersion) || 2 != HIBYTE(wsaData.wVersion))
	{
		WSACleanup(); //没有绑定对版本,要调用WSACleanup函数来解除与Socket库的绑定并且释放Socket库所占用的系统资源。
		cout << "WSADATA version is not correct!" << endl;
		return -1;
	}
	cilent = socket(AF_INET, SOCK_STREAM, 0);
	SOCKADDR_IN addrSrv;
	addrSrv.sin_addr.S_un.S_addr = inet_addr("172.30.88.74");
	addrSrv.sin_family = AF_INET;
	addrSrv.sin_port = htons(6000);
	connect(cilent, (sockaddr*)&addrSrv, sizeof(addrSrv));
	char recvadta[1024] = { 0 };
	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");//创建互斥量*/
	menu();
}
DWORD WINAPI Fun_Send(LPVOID)
{
	while (flag_connect)
	{
		cin >> sendBuff;
		int iRet = send(cilent, sendBuff, sizeof(sendBuff), 0);
		if (iRet <= 0)
		{
			cout << "退出考试系统" << endl;
			closesocket(cilent);
			WSACleanup();
			flag_connect = 0;
			return -1;
		}

	}
	return 0;
}
DWORD WINAPI Fun_Recv(LPVOID)
{
	while (flag_connect)
	{
		Sleep(100);
		int iRet = recv(cilent, recvBuff, 255, 0);
		if (iRet <= 0)
		{
			cout << "退出考试系统" << endl;
			closesocket(cilent);
			WSACleanup();
			flag_connect = 0;
			return -1;
		}
		if (strcmp(recvBuff, "您可以执行如下操作:\n") == 0)
		{      
				system("cls");
			cout << "您可以执行如下操作" << endl;
			cout << "想要添加试题请按1" << endl;
			cout << "想要查询用户请按2" << endl;
			cout << "想要更新用户请按3" << endl;
			cout << "想要删除用户请按4" << endl;
			cout << "想要退出系统请按5" << endl;
		}
		else if (strcmp(recvBuff, "请输入查询条件:") == 0)
		{
			cout << recvBuff << endl;
			cout << "1:按学号查找" << endl;
			cout << "2:按账号查找" << endl;
			cout << "3:按身份查找" << endl;
			cout<< "4:按手机号查找" << endl;
			cout<< "5:按邮箱查找" << endl;
		}
		else
		{
			cout << recvBuff;
		}


	}
	return 0;
}
  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值