此项目能完成的功能有以下几点
注册( 防止账号重复)
登陆( 防止重复登陆)
注销
群聊
私聊
时间显示(时间编程)
昵称显示
上下线提示
修改密码
聊天记录(数据库实现)
查看聊天记录
管理员: 禁言、 解禁、 权限转让
代码部分分为服务器和客户端两部分;
服务器部分代码如下(小部分未完善,不影响整体功能的使用)、
#include <sys/types.h>
#include <sys/socket.h>
#include <mysql/mysql.h>
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include <string.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <sys/time.h>
#include <sys/epoll.h>
#include <time.h>
struct all
{
char id[20]; // 账号
char pwd[20]; // 密码
char info[100]; // 用户发送的消息
char rev[100]; // 用户接受的消息
char toid[20]; // 发送的id
int gongneng; // 功能选择
};
struct all r_info = {0}; // 用户发送的信息
char s_info[50] = {0}; // 服务器向客户端发送的消息
char tishi[50] = {0};
int s_fd;
int ser; // 错误判断
struct epoll_event lis[21]; // 句柄监听数组
int count; // 标志位
MYSQL *p = NULL; // 核心结构体
MYSQL_RES *a = NULL; // 转换体
int row = 0; // 行数
int column = 0; // 列数
char order[50] = {0}; // 指令拼接存放
int u_fd[20] = {0}; // 用户通信套接字存放
time_t r_tm;
int t_fd = 0;
void fun(void);
void printall(void);
int denglu(struct all r_info);
int lookfor_id(struct all r_info);
int check_speak(struct all r_info);
int main()
{
//**************************************************服务器框架
//*****************************************网络部分
s_fd = socket(AF_INET, SOCK_STREAM, 0);
if (s_fd == -1)
{
perror("socket");
}
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(11111);
addr.sin_addr.s_addr = inet_addr("127.0.0.1");//ping自己
ser = bind(s_fd, (const struct sockaddr *)&addr, sizeof(addr));
if (ser == -1)
{
perror("bind");
}
ser = listen(s_fd, 20);
if (ser == -1)
{
perror("listen");
}
printf("网络部分初始完成\n");
//***********************************************句柄部分
int e_id = epoll_create(1); // 创建句柄
if (e_id == -1)
{
perror("epoll_create");
}
struct epoll_event ev;
ev.events = EPOLLIN;
ev.data.fd = s_fd;
ser = epoll_ctl(e_id, EPOLL_CTL_ADD, s_fd, &ev); // 添加句柄
if (ser == -1)
{
perror("epoll_ctl");
}
struct sockaddr_in userfd;
int size = sizeof(userfd);
printf("句柄初始完成\n");
p = mysql_init(NULL); // 创建核心体
p = mysql_real_connect(p, "localhost", "root", "1", "userinfo", 0, NULL, 0); // 连接全部数据库
if (p == NULL)
{
perror("mysql_real_connect");
}
while (1)
{
//**********************************************连接数据库部分
int res = mysql_query(p, "select *from userinfo"); // 筛选目标数据库
if (res != 0)
{
perror("mysql_query");
}
a = mysql_store_result(p); // 核心体转换为MYSQL_RES*类型
row = mysql_num_rows(a); // 行数
if (row == -1)
{
perror("mysql_num_rows");
}
column = mysql_num_fields(a); // 列数
if (column == -1)
{
perror("mysql_num_fields");
}
r_tm = time(NULL); // 时间编成部分
struct tm *local = localtime(&r_tm);
// printf("行:%d\t列:%d\n", row, column);
// printf("数据库连接成功\n");
//******************************************************************************套接字检测部分
int f_count = epoll_wait(e_id, lis, 21, -1); // 创建套接字
for (int i = 0; i < f_count; i++) // 遍历异动的套接字
{
if (lis[i].data.fd == s_fd && lis[i].events == EPOLLIN) // 用户连接服务器
{
t_fd = accept(s_fd, (struct sockaddr *)&userfd, &size);
printf("用户%d已连接服务器\n", t_fd);
struct epoll_event ev;
ev.data.fd = t_fd;
ev.events = EPOLLIN;
ser = epoll_ctl(e_id, EPOLL_CTL_ADD, t_fd, &ev); // 添加句柄
}
if (lis[i].data.fd != s_fd && lis[i].events == EPOLLIN) // 收到用户发送消息
{
res = recv(lis[i].data.fd, &r_info, sizeof(r_info), 0);
//**********************************************************************************客户端下线
if (res == 0)
{
epoll_ctl(e_id, EPOLL_CTL_DEL, lis[i].data.fd, NULL); // 将cfd[i],从数组中移除
for (int j = 0; j < count; j++)
{
if (u_fd[j] == lis[i].data.fd)
{
for (int m = j; m < count; m++)
{
u_fd[m] = u_fd[m + 1];
}
break;
}
}
count--;
printf("%d已退出\n", lis[i].data.fd);
char temp1[100] = {0};
char temp2[100] = {0};
char temp3[100] = {0};
sprintf(temp1, "update userinfo set chatflag=0 where tongxin='%d'", lis[i].data.fd);
sprintf(temp2, "update userinfo set logflag=0 where tongxin='%d'", lis[i].data.fd);
sprintf(temp3, "update userinfo set tongxin=0 where tongxin='%d'", lis[i].data.fd);
ser = mysql_query(p, temp1); // 退出时聊天状态标志位置0
if (ser != 0)
{
perror("mysql_query");
}
ser = mysql_query(p, temp2); // 退出时登陆状态标志位置0
if (ser != 0)
{
perror("mysql_query");
}
ser = mysql_query(p, temp3); // 退出时通信标志位置0
if (ser != 0)
{
perror("mysql_query");
}
break;
}
if (strlen(r_info.info) != 0 && r_info.gongneng != 34 && r_info.gongneng >= 30) // 消息区不为空则转发消息给信息套接字数组
{
int flag=check_speak(r_info);
if (flag==0)
{
char temp0[150] = {0};
sprintf(temp0, "你已被禁言");
send(lis[i].data.fd, temp0, sizeof(temp0), 0);
break;
}
for (int n = 0; n < count; n++)
{
if (u_fd[n] != lis[i].data.fd)
{
char temp0[150] = {0};
sprintf(temp0, "%d时%d分%d秒\n用户%d发送:%s", local->tm_hour, local->tm_min, local->tm_sec, lis[i].data.fd, r_info.info);
send(u_fd[n], temp0, sizeof(temp0), 0);
}
}
break;
}
if (strlen(r_info.info) != 0 && r_info.gongneng < 30) // 消息区不为空并且功能位为对方通信套接字
{
int flag=check_speak(r_info);
if (flag==0)
{
char temp0[150] = {0};
sprintf(temp0, "你已被禁言");
send(lis[i].data.fd, temp0, sizeof(temp0), 0);
break;
}
if (!strcmp(r_info.info, "quit")) // 收到quit不转发
{
break;
}
char temp0[150] = {0};
sprintf(temp0, "%d时%d分%d秒\n用户%d私聊你:%s", local->tm_hour, local->tm_min, local->tm_sec, lis[i].data.fd, r_info.info);
// sprintf(temp0, "用户%d私聊你:%s", lis[i].data.fd, r_info.info);
send(r_info.gongneng, temp0, sizeof(temp0), 0);
break;
}
if (r_info.gongneng == 30) //****************************************用户请求登陆
{
int flag1 = denglu(r_info);
if (flag1 == 1)
{
char success[110] = {"登陆成功"};
printf("%d登陆成功\n", lis[i].data.fd);
send(lis[i].data.fd, success, sizeof(success), 0);
// char temp4[100] = {0};
// sprintf(temp4, "update userinfo set logflag=1 where id='%s'", r_info.id);
// ser = mysql_query(p, temp4); // 登陆成功登陆标志位置1
// if (ser != 0)
// {
// perror("mysql_query");
// }
char temp5[100] = {0};
sprintf(temp5, "update userinfo set tongxin=%d where id='%s'", lis[i].data.fd, r_info.id);
ser = mysql_query(p, temp5); // 登陆成功通信套接字赋值
if (ser != 0)
{
perror("mysql_query");
}
break;
}
if (flag1 == 2)
{
char success[110] = {"管理员登陆成功"};
printf("%d管理员登陆成功\n", lis[i].data.fd);
send(lis[i].data.fd, success, sizeof(success), 0);
// char temp4[100] = {0};
// sprintf(temp4, "update userinfo set logflag=1 where id='%s'", r_info.id);
// ser = mysql_query(p, temp4); // 登陆成功登陆标志位置1
// if (ser != 0)
// {
// perror("mysql_query");
// }
char temp5[100] = {0};
sprintf(temp5, "update userinfo set tongxin=%d where id='%s'", lis[i].data.fd, r_info.id);
ser = mysql_query(p, temp5); // 登陆成功通信套接字赋值
if (ser != 0)
{
perror("mysql_query");
}
break;
}
if (flag1 == -1)
{
char success[100] = {"登陆失败,检查该账号是否存在或密码是否正确\n"};
send(lis[i].data.fd, success, sizeof(success), 0);
break;
}
}
if (r_info.gongneng == 31) //****************************************用户请求注册
{
int flag = lookfor_id(r_info);
if (flag != -1)
{
char success[50] = {"该账号已存在\n"};
send(lis[i].data.fd, success, sizeof(success), 0);
break;
}
char temp[100] = {0};
sprintf(temp, "insert into userinfo values('%s','%s',0,0,0,0,0)", r_info.id, r_info.pwd);
int ser = mysql_query(p, temp); // insert into 表名 values(第一列数据,第二列数据,第三列数据);
if (ser != 0)
{
perror("mysql_query");
}
char success[50] = {"注册成功"};
printf("%d注册成功\n", lis[i].data.fd);
send(lis[i].data.fd, success, sizeof(success), 0);
break;
}
if (r_info.gongneng == 32) //****************************************用户请求注销
{
int flag = lookfor_id(r_info);
if (flag == -1)
{
char success[50] = {"该账号不存在\n"};
send(lis[i].data.fd, success, sizeof(success), 0);
break;
}
char temp[100] = {0};
sprintf(temp, "delete from userinfo where id='%s' and password='%s'", r_info.id, r_info.pwd);
int ser = mysql_query(p, temp); // insert into 表名 values(第一列数据,第二列数据,第三列数据);
if (ser != 0)
{
perror("mysql_query");
}
char success[50] = {"注销成功\n"};
printf("%d注销成功\n", lis[i].data.fd);
send(lis[i].data.fd, success, sizeof(success), 0);
break;
}
if (r_info.gongneng == 33) //****************************************用户请求加入聊天室
{
u_fd[count] = lis[i].data.fd;
count++;
char temp[100] = {0};
sprintf(temp, "update userinfo set chatflag=1 where id='%s'", r_info.id);
int ser = mysql_query(p, temp); // update 表名 set 数据名=数据 where 判断条件;
printf("%d加入聊天室\n", lis[i].data.fd);
if (ser != 0)
{
perror("mysql_query");
}
break;
}
if (r_info.gongneng == 34) //****************************************用户请求修改密码
{
char **r = NULL;
while (r = mysql_fetch_row(a))
{
if (!strcmp(r[0], r_info.id))
{
if ((!strcmp(r[1], r_info.pwd)))
{
char temp[200] = {0};
sprintf(temp, "update userinfo set password='%s' where id='%s'", r_info.info, r_info.id);
int ser = mysql_query(p, temp); // update 表名 set 数据名=数据 where 判断条件;
if (ser != 0)
{
perror("mysql_query");
}
char success[50] = {"修改成功\n"};
send(lis[i].data.fd, success, sizeof(success), 0);
break;
}
}
}
char success1[50] = {"账号或密码输入错误\n"};
send(lis[i].data.fd, success1, sizeof(success1), 0);
}
if (r_info.gongneng == 35) //****************************************用户请求私聊
{
int flag0 = 0;
char **r = NULL;
while (r = mysql_fetch_row(a))
{
if (!strcmp(r[0], r_info.id))
{
if ((!strcmp(r[2], "0")))
{
char success2[50] = {0};
sprintf(success2, "该用户不在线");
send(lis[i].data.fd, success2, sizeof(success2), 0);
flag0 = 1;
break;
}
// if ((!strcmp(r[2], "1")) && (!strcmp(r[3], "1")))
// {
// char success3[50] = {0};
// sprintf(success3, "该用户正在私聊中");
// send(lis[i].data.fd, success3, sizeof(success3), 0);
// // sl_fd[sl_count]=atoi(r[6]);
// // sl_count++;
// break;
// }
if (!strcmp(r[2], "1"))
{
char success1[50] = {0};
sprintf(success1, "%s", r[6]);
send(lis[i].data.fd, success1, sizeof(success1), 0);
// sl_fd[sl_count]=atoi(r[6]);
// sl_count++;
flag0 = 1;
break;
}
}
}
if (flag0 == 0)
{
char success1[50] = {"没有这个id号"};
send(lis[i].data.fd, success1, sizeof(success1), 0);
}
}
if (r_info.gongneng == 36) //****************************************管理员请求禁言
{
int flag0 = 0;
char **r = NULL;
while (r = mysql_fetch_row(a))
{
if (!strcmp(r[0], r_info.id))
{
if ((!strcmp(r[5], "0")))
{
char temp[200] = {0};
sprintf(temp, "update userinfo set speakflag=1 where id='%s'", r_info.id);
int ser = mysql_query(p, temp); // update 表名 set 数据名=数据 where 判断条件;
if (ser != 0)
{
perror("mysql_query");
}
char success2[50] = {0};
sprintf(success2, "用户%s已被禁言", r_info.id);
send(lis[i].data.fd, success2, sizeof(success2), 0);
flag0 = 1;
break;
}
if ((!strcmp(r[5], "1")))
{
char success2[60] = {0};
sprintf(success2, "用户%s已被禁言无需再次操作", r_info.id);
send(lis[i].data.fd, success2, sizeof(success2), 0);
flag0 = 1;
break;
}
}
}
if (flag0 == 0)
{
char success1[50] = {"没有这个id号"};
send(lis[i].data.fd, success1, sizeof(success1), 0);
}
}
if (r_info.gongneng == 37) //****************************************管理员请求解除禁言
{
int flag0 = 0;
char **r = NULL;
while (r = mysql_fetch_row(a))
{
if (!strcmp(r[0], r_info.id))
{
if ((!strcmp(r[5], "1")))
{
char temp[200] = {0};
sprintf(temp, "update userinfo set speakflag=0 where id='%s'", r_info.id);
int ser = mysql_query(p, temp); // update 表名 set 数据名=数据 where 判断条件;
if (ser != 0)
{
perror("mysql_query");
}
char success2[50] = {0};
sprintf(success2, "用户%s已被解除禁言", r_info.id);
send(lis[i].data.fd, success2, sizeof(success2), 0);
flag0 = 1;
break;
}
if ((!strcmp(r[5], "0")))
{
char success3[60] = {0};
sprintf(success3, "用户%s已解除禁言无需再次操作", r_info.id);
send(lis[i].data.fd, success3, sizeof(success3), 0);
flag0 = 1;
break;
}
}
}
if (flag0 == 0)
{
char success1[50] = {"没有这个id号"};
send(lis[i].data.fd, success1, sizeof(success1), 0);
}
}
if (r_info.gongneng == 38) //****************************************管理员请求下放管理员权限
{
int flag0 = 0;
char **r = NULL;
while (r = mysql_fetch_row(a))
{
if (!strcmp(r[0], r_info.id))
{
if ((!strcmp(r[4], "0")))
{
char temp[200] = {0};
sprintf(temp, "update userinfo set manageflag=1 where id='%s'", r_info.id);
int ser = mysql_query(p, temp); // update 表名 set 数据名=数据 where 判断条件;
if (ser != 0)
{
perror("mysql_query");
}
char success2[50] = {0};
sprintf(success2, "用户%s已拥有管理员权限", r_info.id);
send(lis[i].data.fd, success2, sizeof(success2), 0);
flag0 = 1;
break;
}
if ((!strcmp(r[4], "1")))
{
char success3[60] = {0};
sprintf(success3, "用户%s已是管理员", r_info.id);
send(lis[i].data.fd, success3, sizeof(success3), 0);
flag0 = 1;
break;
}
}
}
if (flag0 == 0)
{
char success1[50] = {"没有这个id号"};
send(lis[i].data.fd, success1, sizeof(success1), 0);
}
}
if (r_info.gongneng == 39) //****************************************管理员请求回收管理员权限
{
int flag0 = 0;
char **r = NULL;
while (r = mysql_fetch_row(a))
{
if (!strcmp(r[0], r_info.id))
{
if ((!strcmp(r[4], "1")))
{
char temp[200] = {0};
sprintf(temp, "update userinfo set manageflag=0 where id='%s'", r_info.id);
int ser = mysql_query(p, temp); // update 表名 set 数据名=数据 where 判断条件;
if (ser != 0)
{
perror("mysql_query");
}
char success2[50] = {0};
sprintf(success2, "用户%s已回收管理员权限", r_info.id);
send(lis[i].data.fd, success2, sizeof(success2), 0);
flag0 = 1;
break;
}
if ((!strcmp(r[4], "0")))
{
char success3[60] = {0};
sprintf(success3, "用户%s已被回收请勿重复操作", r_info.id);
send(lis[i].data.fd, success3, sizeof(success3), 0);
flag0 = 1;
break;
}
}
}
if (flag0 == 0)
{
char success1[50] = {"没有这个id号"};
send(lis[i].data.fd, success1, sizeof(success1), 0);
}
}
}
}
}
mysql_close(p);
return 0;
}
int check_speak(struct all r_info)
{
char **r = NULL;
while (r = mysql_fetch_row(a))
{
if (!strcmp(r[0], r_info.id))
{
if ((!strcmp(r[5], "1")))
{
return 0;
}
else
{
return 1;
}
}
}
}
void printall(void)
{
printf("%d %d", row, column);
MYSQL_FIELD *head = NULL; // 打印列头
while (head = mysql_fetch_field(a))
{
printf("%s\t", head->name);
}
printf("\n");
char **info = NULL; // 打印每一行数据
while (info = mysql_fetch_row(a))
{
for (int i = 0; i < column; i++)
{
printf("%s\t", info[i]);
}
printf("\n");
}
return;
}
int lookfor_id(struct all r_info)
{
int count = 0;
char **r = NULL;
while (r = mysql_fetch_row(a))
{
if (!strcmp(r[0], r_info.id))
{
return count;
}
count++;
}
return -1;
}
int denglu(struct all r_info)
{
int count = 0;
char **r = NULL;
while (r = mysql_fetch_row(a))
{
if (!strcmp(r[0], r_info.id))
{
if ((!strcmp(r[1], r_info.pwd)) && (!strcmp(r[2], "0")) && (!strcmp(r[4], "0")))
{
char temp[100] = {0};
sprintf(temp, "update userinfo set logflag=1 where id='%s'", r_info.id); // update 表名 set 数据名=数据 where 判断条件;
// printf("用户登陆成功\n");
int res = mysql_query(p, temp);
if (res != 0)
{
perror("mysql_query");
}
return 1;
}
if ((!strcmp(r[1], r_info.pwd)) && (!strcmp(r[2], "0")) && (!strcmp(r[4], "1")))
{
char temp1[100] = {0};
sprintf(temp1, "update userinfo set logflag=1 where id='%s'", r_info.id); // update 表名 set 数据名=数据 where 判断条件;
// printf("用户登陆成功\n");
int res = mysql_query(p, temp1);
if (res != 0)
{
perror("mysql_query");
}
return 2;
}
return -1;
}
}
return -1;
}
客户端部分代码如下
#include <sys/types.h>
#include <sys/socket.h>
#include <mysql/mysql.h>
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include <string.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <sys/time.h>
#include <sys/epoll.h>
#include <time.h>
struct all
{
char id[20]; // 账号
char pwd[20]; // 密码
char info[100]; // 用户发送的消息
char rev[100]; // 用户接受的消息
char toid[20]; // 发送的id
int gongneng; // 功能选择
};
MYSQL *p = NULL; // 核心结构体
MYSQL_RES *a = NULL; // 转换体
int row = 0; // 行数
int column = 0; // 列数
struct all s_info = {0}; // 用户发送的信息
struct all user = {0}; // 用户信息
char rev[110] = {0};
int s_fd;
int ser;
pthread_t pid1 = 0;
pthread_t pid2 = 0;
char success[110] = {"登陆成功"};
void denglu(void);
void *fun1(void *lll);
void zhuce(void);
void zhuxiao(void);
void jiaru(void);
void caidan(void);
void xiugai(void);
void siliao(void);
void silioa2(void);
void jilu(void);
void sahnchujilu(void);
void glcaidan(void);
void jinyan(void);
void jiejin(void);
void xiafang(void);
void shouhui(void);
int main()
{
printf("连接服务器中......\n");
s_fd = socket(AF_INET, SOCK_STREAM, 0);
if (s_fd == -1)
{
perror("socket");
}
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(11111);
addr.sin_addr.s_addr = inet_addr("127.0.0.1");
connect(s_fd, (const struct sockaddr *)&addr, sizeof(addr));
printf("连接服务器成功!!!\n");
printf("数据库连接中.........\n");
p = mysql_init(NULL); // 创建核心体
p = mysql_real_connect(p, "localhost", "root", "1", "message", 0, NULL, 0); // 连接全部数据库
if (p == NULL)
{
perror("mysql_real_connect");
}
pthread_create(&pid1, NULL, fun1, NULL);
while (1)
{
system("clear");
printf("********************欢迎来到登陆界面\n");
printf("********************请选择功能\n");
printf("********************1:登陆\n");
printf("********************2:注册\n");
printf("********************0:退出\n");
char choose = '0';
scanf("%c", &choose);
while (getchar() != '\n')
;
switch (choose)
{
case ('1'):
denglu();
sleep(1);
if (!strcmp(rev, "登陆成功"))
{
char temp[100] = {0};
sprintf(temp, "create table A%s (message CHAR(150))", user.id);
ser = mysql_query(p, temp);
caidan();
}
if (!strcmp(rev, "管理员登陆成功"))
{
char temp[100] = {0};
sprintf(temp, "create table A%s (message CHAR(150))", user.id);
ser = mysql_query(p, temp);
glcaidan();
}
break;
case ('2'):
zhuce();
break;
break;
case ('4'):
break;
case ('0'):
return 0;
default:
break;
}
}
return 0;
}
void *fun1(void *lll)
{
while (1)
{
recv(s_fd, rev, 110, 0);
printf("%s\n", rev);
char temp[160] = {0};
sprintf(temp, "insert into A%s values('%s')", user.id, rev);
ser = mysql_query(p, temp);
// if (ser != 0)
// {
// perror("mysql_query");
// }
}
}
void denglu(void)
{
struct all info = {0};
info.gongneng = 30; // 登陆功能1
printf("请输入你的ID:");
gets(info.id);
printf("请输入你的密码:");
gets(info.pwd);
strcpy(user.id, info.id);
strcpy(user.pwd, info.pwd);
send(s_fd, (const void *)&info, sizeof(info), 0);
}
void zhuce(void)
{
struct all info = {0};
info.gongneng = 31; // 注册功能2
printf("请输入你要注册的ID:");
gets(info.id);
printf("请输入你注册的密码:");
gets(info.pwd);
send(s_fd, (const void *)&info, sizeof(info), 0);
}
void glcaidan(void)
{
while (1)
{
printf("********************请选择功能\n");
printf("********************1:加入群聊\n");
printf("********************2:私聊\n");
printf("********************3:注销该id\n");
printf("********************4:更改密码\n");
printf("********************5:查看聊天和操作记录\n");
printf("********************6:删除聊天和操作记录\n");
printf("********************7:禁言\n");
printf("********************8:解禁言\n");
printf("********************9:下放管理员权限\n");
printf("********************q:回收管理员权限\n");
printf("********************0:退出\n");
char choose = '0';
scanf("%c", &choose);
while (getchar() != '\n')
;
switch (choose)
{
case ('1'):
printf("输入quit退出群聊\n");
jiaru();
system("clear");
break;
case ('2'):
siliao();
sleep(1);
if (!strcmp(rev, "该用户不在线") || !strcmp(rev, "没有这个id号") || !strcmp(rev, "该用户正在私聊中"))
{
break;
}
silioa2();
system("clear");
break;
case ('3'):
zhuxiao();
system("clear");
return;
case ('4'):
xiugai();
system("clear");
break;
case ('5'):
jilu();
break;
case ('6'):
sahnchujilu();
break;
case ('7'):
jinyan();
break;
case ('8'):
jiejin();
break;
case ('9'):
xiafang();
break;
case ('q'):
shouhui();
break;
case ('0'):
return;
default:
break;
}
}
}
void xiafang(void)
{
struct all info = {0};
info.gongneng = 38; // 管理员下方权限功能38
printf("请输入你下放权限的ID:");
gets(info.id);
send(s_fd, (const void *)&info, sizeof(info), 0);
}
void shouhui(void)
{
struct all info = {0};
info.gongneng = 39; // 管理员收回权限功能39
printf("请输入你回收权限的ID:");
gets(info.id);
send(s_fd, (const void *)&info, sizeof(info), 0);
}
void jinyan(void)
{
struct all info = {0};
info.gongneng = 36; // 禁言功能36
printf("请输入你要禁言的ID:");
gets(info.id);
send(s_fd, (const void *)&info, sizeof(info), 0);
}
void jiejin(void)
{
struct all info = {0};
info.gongneng = 37; // 解开禁言功能37
printf("请输入你解禁的ID:");
gets(info.id);
send(s_fd, (const void *)&info, sizeof(info), 0);
}
void caidan(void)
{
while (1)
{
printf("********************请选择功能\n");
printf("********************1:加入群聊\n");
printf("********************2:私聊\n");
printf("********************3:注销该id\n");
printf("********************4:更改密码\n");
printf("********************5:查看聊天和操作记录\n");
printf("********************6:删除聊天和操作记录\n");
printf("********************0:退出\n");
char choose = '0';
scanf("%c", &choose);
while (getchar() != '\n')
;
switch (choose)
{
case ('1'):
printf("输入quit退出群聊\n");
jiaru();
system("clear");
break;
case ('2'):
siliao();
sleep(1);
if (!strcmp(rev, "该用户不在线") || !strcmp(rev, "没有这个id号") || !strcmp(rev, "该用户正在私聊中"))
{
break;
}
silioa2();
system("clear");
break;
case ('3'):
zhuxiao();
system("clear");
return;
case ('4'):
xiugai();
system("clear");
break;
case ('5'):
jilu();
break;
case ('6'):
sahnchujilu();
break;
case ('0'):
return;
default:
break;
}
}
}
void jilu(void)
{
char temp[50] = {0};
sprintf(temp, "select *from A%s", user.id);
printf("%s\n", temp);
int res = mysql_query(p, temp); // 筛选目标数据库
if (res != 0)
{
perror("mysql_query");
}
a = mysql_store_result(p); // 核心体转换为MYSQL_RES*类型
row = mysql_num_rows(a); // 行数
if (row == -1)
{
perror("mysql_num_rows");
}
char **r = NULL;
while (r = mysql_fetch_row(a))
{
printf("%s\n", r[0]);
}
printf("一共有%d行消息\n", row);
printf("按任意建返回.....\n");
getchar();
// getchar();
}
void sahnchujilu(void)
{
char choose = '0';
printf("是否要删除所有记录y/n:");
scanf("%c", &choose);
while (getchar() != '\n')
;
if (choose == 'y')
{
char temp[50] = {0};
sprintf(temp, "drop table A%s", user.id);
ser = mysql_query(p, temp);
if (ser != 0)
{
perror("mysql_query");
}
printf("删除成功\n");
sleep(1);
}
else
{
return;
}
// drop table 表名;
}
void siliao(void)
{
struct all info = {0};
info.gongneng = 35; // 私聊功能6
printf("请输入你想要私聊用户的id:");
gets(info.id);
send(s_fd, (const void *)&info, sizeof(info), 0);
}
void silioa2(void)
{
printf("和用户连接成功\n");
struct all info = {0};
int slfd = atoi(rev);
info.gongneng = slfd;
printf("请输入你要私聊的内容\n");
strcpy(info.id,user.id);
while (1)
{
gets(info.info);
send(s_fd, (const void *)&info, sizeof(info), 0);
if (!strcmp(info.info, "quit"))
{
return;
}
char temp[150] = {0};
sprintf(temp, "insert into A%s values(%s)", user.id, info.info);
ser = mysql_query(p, temp);
// if (ser != 0)
// {
// perror("mysql_query");
// }
// insert into 表名 values(第一列数据,第二列数据,第三列数据);
}
}
void xiugai(void)
{
struct all info = {0};
char temp[20] = {0};
info.gongneng = 34; // 修改密码功能5
printf("请输入你的ID:");
gets(info.id);
printf("请输入你的密码:");
gets(info.pwd);
printf("请输入你修改后的密码:");
gets(info.info);
printf("请再次输入你修改后的密码:");
gets(temp);
if (!strcmp(temp, info.info))
{
send(s_fd, (const void *)&info, sizeof(info), 0);
return;
}
printf("两次输入密码不同,请重新输入\n");
sleep(1);
}
void zhuxiao(void)
{
// struct all info = {0};
user.gongneng = 32; // 注销功能3
char choose = '0';
printf("是否要注销该账号y/n:");
scanf("%c", &choose);
while (getchar() != '\n')
;
if (choose == 'y')
{
send(s_fd, (const void *)&user, sizeof(user), 0);
}
}
void jiaru(void)
{
user.gongneng = 33; // 加入聊天室4
send(s_fd, (const void *)&user, sizeof(user), 0);
printf("加入成功!\n");
while (1)
{
gets(user.info);
send(s_fd, (const void *)&user, sizeof(user), 0);
if (!strcmp(user.info, "quit"))
{
return;
}
char temp[150] = {0};
sprintf(temp, "insert into A%s values('%s')", user.id, user.info);
ser = mysql_query(p, temp);
// if (ser != 0)
// {
// perror("mysql_query");
// }
}
}