服务端:
#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;
}