里面的提示信息混乱有没有大佬帮我改一下,就下面那个
char feedback[50];//反馈信息,服务器给客户端返回处理结果
服务器端
#include <stdio.h>
#include <stdlib.h>
#include <string.h>//字符串
#include <unistd.h>
#include <sys/socket.h>//tCp网络编程
#include <netinet/in.h>//绑定需要
#include <arpa/inet.h>//转换需要
#include <mysql/mysql.h>//数据库
#include <sys/select.h>//多路io复用
#include <sys/types.h>//文件操作
#include <sys/stat.h>
#include <fcntl.h>
#include <time.h>//时间
typedef struct
{
char name[20];//用户名
char passwd[20];//用户密码
int ID;//用户账号
char type;//消息类型 -- 判断要干什么
char feedback[50];//反馈信息,服务器给客户端返回处理结果
int online;//在线状态
int s_ID;//聊天对象的ID
char adm[3];//管理员标志
char t_buf[128];//用于读写操作
int tjz;//套接字
char L_time[30];
} CLI;
CLI er_abc,ew_abc;
MYSQL *con;
MYSQL_RES *result;
int clients = 0;//接入的客户端数
int server_fd,client_fds[50];//套接字
MYSQL_ROW row;
char query[255] = {};
int i;
int adm = 0;
void login(int lo);
void G_login(int lo);
void log_off(int rc);
//void group_chat(int i,int cs);
void registerClient(int rc);
void Private_chat(int rs,int s_ID);
void PrivateChat(int rs);
void No_Speaking(int rc);
void Yes_Speaking(int rc);
void Kick_people(int Gc);
void Txt();
int look();
int Account();
int main()
{
int max_fd;//套接字最大值
fd_set read_fds,all_fds;//创建保存套接字的集合
socklen_t len;//计算accept需要的结构体的大小
struct sockaddr_in server_addr, client_addr;//用于绑定地址和端口号的结构体
int res;//接收各函数的返回值
//连接MySql数据库
con = mysql_init(NULL);
if(con == NULL)
{
perror("mysql_init");
return -1;
}
perror("mysql_init");
//登陆数据库
con = mysql_real_connect(con,"localhost","root","123","826_stu",0,NULL,0);
if(con == NULL)
{
perror("mysql_real_connect");
return -1;
}
perror("mysql_real_connect");
//创建服务器套接字 ipv4 TCP
server_fd = socket(AF_INET,SOCK_STREAM,0);
if(server_fd == -1)
{
perror("socket");
return -1;
}
printf("%d号服务器启动..\n",server_fd);
perror("socket");
//防止端口号被占用
int val = 1;
setsockopt(server_fd,SOL_SOCKET,SO_REUSEADDR,&val,sizeof(val));
//设置bind需要的参数
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");//或INADDR_ANY表示当地地址
server_addr.sin_port = htons(12345);//端口号用于和客户端之间的通信
//绑定套接字到服务器地址
res = bind(server_fd,(struct sockaddr *)&server_addr,sizeof(server_addr));
if(res == -1)
{
perror("bind");
return -1;
}
perror("bind");
//设置监听连接请求数量
res = listen(server_fd,50);
if(res == -1)
{
perror("listen");
return -1;
}
perror("listen");
//初始化客户端套接字集合
FD_ZERO(&all_fds);
//将服务器套接字先放入集合中
FD_SET(server_fd,&all_fds);
max_fd = server_fd;//设置最大套接字
len = sizeof(client_addr);//接收客户端结构体的大小
printf("等待客户端连接...\n");
//创建循环方便多个客户端的接入
while (1)
{
printf("进入循环创建客户端接入\n");
//复制套接字的集合便于侦察读文件是否发生异动
read_fds = all_fds;
//select的多路io复用
res = select(max_fd + 1,&read_fds,NULL,NULL,NULL);
if(res == -1)
{
perror("select");
return -1;
}
perror("select");
//检测集合fds中的fd是否变化,变化为0
if(FD_ISSET(server_fd,&read_fds))
{
//接收客户端的连接
client_fds[clients] = accept(server_fd,(struct sockaddr *)&client_addr,&len);
if(client_fds[clients] == -1)
{
perror("accept");
return -1;
}
printf("%d号客户端接入\n",client_fds[clients]);
perror("accept");
ew_abc.tjz = client_fds[clients];
//将新加入的客户端套接字加入集合中
FD_SET(client_fds[clients],&all_fds);
//更新最大套接字
if(client_fds[clients] > max_fd)
max_fd = client_fds[clients];
//更新接收客户端的连接返回值的数组下标
clients++;
/*select的返回值表示变化的文件描述符的总个数,
如果只有一个sockfd(连接套接字)发生变化,
说明此时客户端只是连接还未进行数据传输,
则没必要继续检测是否进行通讯,结束本次循环*/
if(res == 1)
continue;
}
//如果有客户端连接就执行该循环
for(i=0;i<clients;i++)
{
printf("如果有客户端连接就执行该循环\n");
if(FD_ISSET(client_fds[i],&read_fds))
{
printf("判断套接字是否改变%d %d\n",i,clients);
ssize_t recv_len = recv(client_fds[i],&er_abc,sizeof(er_abc),0);
printf("接收的数据:%c\n",er_abc.type);
if(recv_len < 0)
{
perror("recv");
return -1;
}
else if(recv_len == 0)
{
printf("%d号已关闭连接\n",client_fds[i]);
//close(client_fds[i]);
FD_CLR(client_fds[i],&all_fds);
//printf("%d%d\n",ew_abc.tjz,client_fds[i]);
sprintf(query,"select 姓名,管理权限 from LT where 套接字=%d",client_fds[i]);
if(mysql_query(con,query))
{
printf("对比不成功\n");
exit(1);
}
//获取查询结果
result = mysql_store_result(con);
if(result == NULL)
{
printf("获取数据失败\n");
exit(1);
}
//判断接收的账号是否正确
if(row = mysql_fetch_row(result))
{
strcpy(ew_abc.name,row[0]);
strcpy(ew_abc.adm,row[1]);
}
sprintf(ew_abc.t_buf,"%s已下线",ew_abc.name);
for(int j = 0;j<clients;j++)
{
if(j != i)
{
printf("%s\n",ew_abc.t_buf);
send(client_fds[j],&ew_abc,sizeof(ew_abc),0);
}
}
sprintf(query,"update LT set 在线状态='0',套接字=-1 where 套接字=%d",client_fds[i]);
//printf("%d\n",client_fds[i]);
if(mysql_query(con,query))
{
printf("修改在线失败\n");
exit(1);
}
//将以下线的客户端移动到集合后面
for(int k = i;k<clients-1;k++)
{
client_fds[k] = client_fds[k+1];
}
clients--;
mysql_free_result(result);
printf("退出已设置************\n");
}
else
{
printf("解析中..\n");
//解析客户端发送的消息
if(er_abc.type == 'D')//登陆
{
//if(ew_abc.tjz == client_fds[i])
login(client_fds[i]);
}
if(er_abc.type == 'Q')//群聊
{
printf("%d\n",adm);
if(!strcmp(er_abc.t_buf,"quit"))
{
printf("私发\n");
send(client_fds[i],&er_abc,sizeof(er_abc),0);
break;
}
if(look() == -1)
break;
//group_chat(i,client_fds[i]);
for(int j = 0;j<clients;j++)
{
if((j != i) && (j != adm))
{
printf("群发\n");
send(client_fds[j],&er_abc,sizeof(er_abc),0);
}
}
Txt();
}
if (er_abc.type == 'Z')//注册
registerClient(client_fds[i]);
if (er_abc.type == 'S')//查找私聊账号
Private_chat(client_fds[i],er_abc.s_ID);
if(er_abc.type == 's')
{
//给自己发送
send(client_fds[i],&er_abc,sizeof(er_abc),0);
if(!strcmp(er_abc.t_buf,"quit"))
break;
//给私聊对象发送
printf("套接字%d\n",er_abc.tjz);
send(er_abc.tjz,&er_abc,sizeof(er_abc),0);
}
if(er_abc.type == 'G')//管理员登陆
G_login(client_fds[i]);
if(er_abc.type == 'J')//禁言账号查询
PrivateChat(client_fds[i]);
if(er_abc.type == 'j')//禁言执行
{
No_Speaking(client_fds[i]);
}
if(er_abc.type == 'X')//解除禁言
Yes_Speaking(client_fds[i]);
if(er_abc.type == 'z')//注销账号
{
log_off(client_fds[i]);
}
if(er_abc.type == 'T')//查找踢人账号
{
er_abc.type = 'T';
Private_chat(client_fds[i],er_abc.s_ID);
printf("%d\n",client_fds[i]);
}
if(er_abc.type == 't')//执行踢人命令
{
Kick_people(client_fds[i]);
}
if(er_abc.type == 'g')//解除踢人命令
{
Yes_Speaking(client_fds[i]);
}
}
}
}
}
//关闭数据库连接
mysql_close(con);
return 0;
}
//登陆
void login(int lo)
{
//查询数据库的数据
sprintf(query,"select 姓名,在线状态,管理权限 from LT where 账号='%d' and 密码='%s'",er_abc.ID,er_abc.passwd);
if(mysql_query(con,query))
{
printf("对比不成功\n");
exit(1);
}
//获取查询结果
result = mysql_store_result(con);
if(result == NULL)
{
printf("获取数据失败\n");
exit(1);
}
//判断接收的账号是否正确
if(row = mysql_fetch_row(result))
{
strcpy(ew_abc.name,row[0]);
ew_abc.online = atoi(row[1]);
strcpy(ew_abc.adm,row[2]);
printf("%s,%s,%s,%d,%d\n",row[0],row[1],row[2],ew_abc.online,ew_abc.tjz);
sprintf(query,"update LT set 在线状态='1',套接字=%d where 账号=%d",ew_abc.tjz,er_abc.ID);
if(mysql_query(con,query))
{
printf("修改在线失败\n");
exit(1);
}
sprintf(ew_abc.feedback,"登陆成功!");
if(ew_abc.online == 1)
sprintf(ew_abc.feedback,"该账号已登陆!");
ew_abc.tjz = client_fds[i];
send(lo,&ew_abc,sizeof(ew_abc),0);
mysql_free_result(result);
//提示各客户端本用户上线
sprintf(query,"select 姓名,套接字 from LT where 套接字=%d",client_fds[i]);
if(mysql_query(con,query))
{
printf("对比不成功\n");
exit(1);
}
//获取查询结果
result = mysql_store_result(con);
if(result == NULL)
{
printf("获取数据失败\n");
exit(1);
}
//判断接收的账号是否正确
if(row = mysql_fetch_row(result))
{
strcpy(ew_abc.name,row[0]);
}
sprintf(ew_abc.t_buf,"%s已上线",ew_abc.name);
for(int j = 0;j<clients;j++)
{
if((j != i) && (j != adm))
{
printf("%s\n",ew_abc.t_buf);
send(client_fds[j],&ew_abc,sizeof(ew_abc),0);
}
}
}
else
{
sprintf(ew_abc.feedback,"登陆失败!");
send(lo,&ew_abc,sizeof(ew_abc),0);
}
mysql_free_result(result);
}
//管理员登陆
void G_login(int lo)
{
//查询数据库的数据
sprintf(query,"select 姓名,在线状态,管理权限 from LT where 账号='%d' and 密码='%s'",er_abc.ID,er_abc.passwd);
if(mysql_query(con,query))
{
printf("对比不成功\n");
exit(1);
}
//获取查询结果
result = mysql_store_result(con);
if(result == NULL)
{
printf("获取数据失败\n");
exit(1);
}
//判断接收的账号是否正确
if(row = mysql_fetch_row(result))
{
strcpy(ew_abc.name,row[0]);
ew_abc.online = atoi(row[1]);
strcpy(ew_abc.adm,row[2]);
printf("%s,%s,%s,管理%s\n",row[0],row[1],row[2],ew_abc.adm);
if(!strcmp(ew_abc.adm,"0"))
{
printf("该账号不是管理员\n");
sprintf(ew_abc.feedback,"该账号不是管理员!");
send(lo,&ew_abc,sizeof(ew_abc),0);
exit(1);
}
sprintf(query,"update LT set 在线状态='1',套接字=%d where 账号=%d",ew_abc.tjz,er_abc.ID);
if(mysql_query(con,query))
{
printf("修改在线失败\n");
sprintf(ew_abc.feedback,"修改在线失败!");
send(lo,&ew_abc,sizeof(ew_abc),0);
exit(1);
}
sprintf(ew_abc.feedback,"登陆成功!");
if(ew_abc.online == 1)
sprintf(ew_abc.feedback,"该账号已登陆!");
send(lo,&ew_abc,sizeof(ew_abc),0);
adm = lo;
mysql_free_result(result);
//提示各客户端本用户上线
sprintf(query,"select 姓名 from LT where 套接字=%d",client_fds[i]);
if(mysql_query(con,query))
{
printf("对比不成功\n");
exit(1);
}
//获取查询结果
result = mysql_store_result(con);
if(result == NULL)
{
printf("获取数据失败\n");
exit(1);
}
//判断接收的账号是否正确
if(row = mysql_fetch_row(result))
{
strcpy(ew_abc.name,row[0]);
}
sprintf(ew_abc.t_buf,"管理员%s已上线",ew_abc.name);
ew_abc.t_buf[strlen(ew_abc.t_buf)] = '\0';
for(int j = 0;j<clients;j++)
{
if(j != i)
{
printf("%s\n",ew_abc.t_buf);
send(client_fds[j],&ew_abc,sizeof(ew_abc),0);
}
}
memset(ew_abc.t_buf, 0, sizeof(ew_abc.t_buf));
}
else
{
sprintf(ew_abc.feedback,"登陆失败!");
send(lo,&ew_abc,sizeof(ew_abc),0);
}
mysql_free_result(result);
}
//注册
void registerClient(int rc)
{
er_abc.ID = Account();
char C_set[255] = {};
sprintf(C_set,"insert into LT values(%d,'%s','%s','0','0',-1)",
er_abc.ID,er_abc.name,er_abc.passwd);
if(mysql_query(con,C_set))
{
printf("注册不成功\n");
sprintf(ew_abc.feedback,"注册不成功!");
exit(1);
}
printf("注册成功%d\n",er_abc.ID);
ew_abc.ID = er_abc.ID;
sprintf(ew_abc.feedback,"注册成功!");
send(rc,&ew_abc,sizeof(er_abc),0);
}
//注销
void log_off(int rc)
{
char C_log_off[255] = {};
sprintf(C_log_off,"delete from LT where 账号=%d and 姓名='%s' and 密码='%s'",
er_abc.ID,er_abc.name,er_abc.passwd);
if(mysql_query(con,C_log_off))
{
printf("注销不成功\n");
sprintf(ew_abc.feedback,"注销不成功,可能信息输入错误!");
exit(1);
}
printf("注销成功账号:%d\n",er_abc.ID);
sprintf(ew_abc.feedback,"注销成功!");
send(rc,&ew_abc,sizeof(er_abc),0);
}
//查找私聊账号/查找禁言账号
void Private_chat(int rs,int s_ID)
{
sprintf(query,"select 姓名,在线状态,套接字 from LT where 账号=%d",s_ID);
if(mysql_query(con,query))
{
printf("查询账号失败\n");
sprintf(ew_abc.feedback,"查询账号失败");
send(rs,&ew_abc,sizeof(ew_abc),0);
exit(1);
}
//获取查询结果
result = mysql_store_result(con);
if(result == NULL)
{
printf("获取数据失败\n");
sprintf(ew_abc.feedback,"获取数据失败");
send(rs,&ew_abc,sizeof(ew_abc),0);
exit(1);
}
if(row = mysql_fetch_row(result))
{
strcpy(ew_abc.name,row[0]);
ew_abc.online = atoi(row[1]);
ew_abc.tjz = atoi(row[2]);
sprintf(ew_abc.feedback,"查询账号成功");
printf("%c %s\n",er_abc.type, ew_abc.feedback);
send(rs,&ew_abc,sizeof(ew_abc),0);
}
else
{
printf("账号不存在\n");
sprintf(ew_abc.feedback,"账号不存在");
send(rs,&ew_abc,sizeof(ew_abc),0);
}
mysql_free_result(result);
}
//禁言名字查询
void PrivateChat(int rs)
{
sprintf(query,"select 账号 from LT where 姓名='%s'",er_abc.t_buf);
if(mysql_query(con,query))
{
printf("查询禁言账号失败\n");
sprintf(ew_abc.feedback,"查询禁言账号失败");
send(rs,&ew_abc,sizeof(ew_abc),0);
exit(1);
}
//获取查询结果
result = mysql_store_result(con);
if(result == NULL)
{
printf("获取禁言数据失败\n");
sprintf(ew_abc.feedback,"获取禁言数据失败");
send(rs,&ew_abc,sizeof(ew_abc),0);
exit(1);
}
if(row = mysql_fetch_row(result))
{
ew_abc.s_ID = atoi(row[0]);
sprintf(ew_abc.feedback,"查询账号成功");
printf("%s\n",ew_abc.feedback);
send(rs,&ew_abc,sizeof(ew_abc),0);
}
else
{
printf("禁言账号不存在\n");
sprintf(ew_abc.feedback,"禁言账号不存在");
send(rs,&ew_abc,sizeof(ew_abc),0);
}
mysql_free_result(result);
}
//禁言执行
void No_Speaking(int rc)
{
sprintf(query,"update LT set 管理权限='J' where 账号=%d",er_abc.s_ID);
if(mysql_query(con,query))
{
printf("修改禁言失败\n");
sprintf(ew_abc.feedback,"修改禁言失败!");
send(rc,&ew_abc,sizeof(ew_abc),0);
exit(1);
}
printf("修改禁言成功\n");
sprintf(ew_abc.feedback,"修改禁言成功!");
send(rc,&ew_abc,sizeof(ew_abc),0);
}
//解除禁言/踢人
void Yes_Speaking(int rc)
{
sprintf(query,"update LT set 管理权限='0' where 账号=%d",er_abc.s_ID);
if(mysql_query(con,query))
{
printf("解除失败\n");
sprintf(ew_abc.feedback,"解除失败!");
send(rc,&ew_abc,sizeof(ew_abc),0);
exit(1);
}
memset(ew_abc.feedback,0,50);
sprintf(ew_abc.feedback,"解除成功!");
printf("%s\n",ew_abc.feedback);
send(rc,&ew_abc,sizeof(ew_abc),0);
}
//踢人
void Kick_people(int Gc)
{
sprintf(query,"update LT set 管理权限='T' where 账号=%d",er_abc.s_ID);
if(mysql_query(con,query))
{
printf("修改踢人失败\n");
sprintf(ew_abc.feedback,"修改踢人失败!");
send(Gc,&ew_abc,sizeof(ew_abc),0);
exit(1);
}
printf("修改踢人成功\n");
sprintf(ew_abc.feedback,"修改踢人成功!");
send(Gc,&ew_abc,sizeof(ew_abc),0);
}
//查看自己是否可以群聊
int look()
{
sprintf(query,"select 管理权限 from LT where 套接字=%d",er_abc.tjz);
//printf("服务器接收套接字:%d\n",er_abc.tjz);
if(mysql_query(con,query))
{
printf("查找重要数据失败1\n");
sprintf(ew_abc.feedback,"查找重要数据失败!");
return -1;
}
//获取查询结果
result = mysql_store_result(con);
if(result == NULL)
{
printf("查找重要数据失败2\n");
sprintf(ew_abc.feedback,"查找重要数据失败!");
return -1;
}
//判断是否接收到数据
if(row = mysql_fetch_row(result))
{
strcpy(ew_abc.adm,row[0]);
if(!strcmp(ew_abc.adm,"J"))
{
printf("该账号已禁言,请联系管理员解除禁言\n");
sprintf(ew_abc.t_buf,"该账号已禁言,请联系管理员解除禁言");
send(client_fds[i],&ew_abc,sizeof(ew_abc),0);
return -1;
}
if(!strcmp(ew_abc.adm,"T"))
{
printf("该账号已被踢出,请联系管理员解除禁言\n");
sprintf(ew_abc.t_buf,"该账号被踢出,请联系管理员解除禁言");
send(client_fds[i],&ew_abc,sizeof(ew_abc),0);
return -1;
}
}
mysql_free_result(result);
return 0;
}
//保存聊天记录
void Txt()
{
FILE * fp = fopen("./聊天.txt","a+");
fprintf(fp,"%s\n用户%s:%s\n",er_abc.L_time,er_abc.name,er_abc.t_buf);
fclose(fp);
}
//设置用户账号
int Account()
{
//设置账号的初值
int id = 10;
//创建/打开一个文档用于储存已经定义好的账号
int fd = open("account.txt",O_RDWR|O_CREAT,0644);
if(fd == -1)
{
perror("open");
return -1;
}
//读取已经创建好了的账号
read(fd,&id,sizeof(int));
id++;
lseek(fd,0,0);
write(fd,&id,sizeof(int));
close(fd);
printf("准备返回账号:%d\n",id);
//返回已经创建好的账号
return id;
}
// //群聊
// void group_chat(int i,int cs)
// {
// printf("群聊\n");
// for(int j = 0;j<clients;j++)
// {
// printf("%d %d\n",i,j);
// if(j != i)
// { printf("向%d发送\n",cs);
// send(cs,&er_abc,sizeof(er_abc),0);
// }
// }
// }
客户端
#include <stdio.h>
#include <sys/types.h> //类型
#include <sys/socket.h>//tcp
#include <netinet/in.h>//绑定
#include <arpa/inet.h>//转换
#include <string.h>//字符串
#include <pthread.h>//线程
#include <time.h>
typedef struct
{
char name[20];//用户名
char passwd[20];//用户密码
int ID;//用户账号
char type;//消息类型 -- 判断要干什么
char feedback[50];//反馈信息,服务器给客户端返回处理结果
int online;//在线状态
int s_ID;//聊天对象的ID
char adm[3];//管理员标志
char t_buf[128];//用于读写操作
int tjz;//套接字
char L_time[30];
} CLI;
CLI cr_abc,cw_abc;
int client_fd;
int count = 0;
int tjz;
int adm = -1;
int adm1 = 0;
char Y_N;
char str[20] = "quit";
char name[20];
void *F_fun(void *p);
void *F_fun1(void *p);
void L_time();
void L_time1();
int menu();
int main()
{
int res;
int a;
struct sockaddr_in server_addr;//通信地址
pthread_t id;//线程
//创建客户端套接字
client_fd = socket(AF_INET,SOCK_STREAM,0);
if(client_fd < 0)
{
perror("socket");
return -1;
}
printf("%d客户端上线\n",client_fd);
perror("socket");
//连接服务器前的准备
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(12345);
server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
//连接服务器
res = connect(client_fd,(struct sockaddr *)&server_addr,sizeof(server_addr));
if(res == -1)
{
perror("connect");
return -1;
}
perror("connect");
next:
do
{
a = menu();
switch (a)
{
case 1:
for(int i=3;i>0;i--)
{
cw_abc.type = 'D';
printf("登陆(依次输入账号密码):");
scanf("%d%s",&cw_abc.ID,cw_abc.passwd);
getchar();
send(client_fd,&cw_abc,sizeof(cw_abc),0);
memset(cr_abc.feedback,0,50);
recv(client_fd,&cr_abc,sizeof(cr_abc),0);
if(!strcmp(cr_abc.adm,"T"))
{
printf("你已被提出群聊!联系管理员解除\n");
return 0;
}
printf("接收:%s\n",cr_abc.feedback);
if(!strcmp(cr_abc.feedback,"该账号已登陆!"))
goto next;
if(!strcmp(cr_abc.feedback,"登陆成功!"))
{
strcpy(name,cr_abc.name);
count = 1;
tjz = cr_abc.tjz;
printf("登陆接收套接字:%d\n",tjz);
printf("count =%d\n",count);
break;
}
printf("你还有%d次机会\n",i-1);
if(i==1)
count=2;
if(count == 2)
{
printf("错误次数过多已下线\n");
return -1;
}
}
break;
case 2:
cw_abc.type = 'Z';
printf("请输入你要注册的姓名和密码:\n");
scanf("%s%s",cw_abc.name,cw_abc.passwd);
getchar();
send(client_fd,&cw_abc,sizeof(cw_abc),0);
recv(client_fd,&cr_abc,sizeof(cr_abc),0);
printf("注册成功你的账号为:%d\n",cr_abc.ID);
printf("返回界面还是退出(y/n):");
Y_N = getchar();
if(Y_N == 'n')
return 0;
break;
case 3:
cw_abc.type = 'G';
printf("请依次输入管理员账号和密码:");
scanf("%d%s",&cw_abc.ID,cw_abc.passwd);
getchar();
send(client_fd,&cw_abc,sizeof(cw_abc),0);
memset(cr_abc.feedback,0,50);
recv(client_fd,&cr_abc,sizeof(cr_abc),0);
printf("接收%s\n",cr_abc.feedback);
if(!strcmp(cr_abc.feedback,"该账号不是管理员!"))
goto next;
if(!strcmp(cr_abc.feedback,"修改在线失败!"))
goto next;
if(!strcmp(cr_abc.feedback,"登陆成功!"))
{
adm1 = 1;
tjz = cr_abc.tjz;
strcpy(name,cr_abc.name);
count = 1;
adm = 1;
}
break;
case 0:
return 0;
break;
default:
printf("输入错误,请重新输入:\n");
break;
}
if(count == 1)
break;
} while (1);
if(adm1 != 1)
{
while (1)
{
printf("\033[0;33m(1.私聊 2.群聊 3.注销账号 0.下线)\n");
printf("请输入你的选择:\033[0m");
scanf("%d",&a);
getchar();
switch (a)
{
case 1:
cw_abc.type = 'S';
printf("请输入要私聊的账号:\n");
scanf("%d",&cw_abc.s_ID);
getchar();
if(cw_abc.s_ID==cw_abc.ID)
{
printf("不能与本账户聊天\n");
continue;
}
send(client_fd,&cw_abc,sizeof(cw_abc),0);
memset(cr_abc.feedback,0,50);
recv(client_fd,&cr_abc,sizeof(cr_abc),0);
if(strcmp(cr_abc.feedback,"查询账号成功"))
{
printf("出现错误:%s\n",cr_abc.feedback);
printf("请重新选择\n");
continue;
}
if(!cr_abc.online)
{
printf("用户不在线请重新选择\n");
continue;
}
tjz = cr_abc.tjz;
//创建线程
res = pthread_create(&id,NULL,F_fun1,NULL);
while (1)
{
recv(client_fd,&cr_abc,sizeof(cr_abc),0);
printf("%s\n{用户(%s)}:%s\n",cr_abc.L_time,cr_abc.name,cr_abc.t_buf);
if(!strcmp(cr_abc.t_buf,str))
break;
}
break;
case 2:
cw_abc.type = 'Q';
//创建线程
res = pthread_create(&id,NULL,F_fun,NULL);
while (1)
{
recv(client_fd,&cr_abc,sizeof(cr_abc),0);
//printf("%s\n",cr_abc.t_buf);
if(!strcmp(cr_abc.adm,"T"))
{
printf("%s\n",cr_abc.t_buf);
return 0;
}
if(!strcmp(cr_abc.t_buf,str))
break;
if(!strcmp(cr_abc.adm,"1"))
{
L_time1();
printf("\033[0;36m%s\n\033[1;5;31;42m{用户(%s)}:%s\033[0m\n",cr_abc.L_time,cr_abc.name,cr_abc.t_buf);
continue;
}
printf("\033[0;36m%s\n\033[0;34m{用户(%s)}:%s\033[0m\n",cr_abc.L_time,cr_abc.name,cr_abc.t_buf);
}
break;
case 3://注销账户
cw_abc.type = 'z';
printf("请依次输入你要注销账号的账号,姓名和密码:\n");
scanf("%d",&a);
if(a != cw_abc.ID)
{
printf("该账号与本账号不同请重新选择\n");
break;
}
//是本账号就继续
cw_abc.ID = a;
scanf("%s%s",cw_abc.name,cw_abc.passwd);
getchar();
printf("你确定要注销么?(y/n)\n");
Y_N = getchar();
if(Y_N == 'n')
break;
send(client_fd,&cw_abc,sizeof(cw_abc),0);
memset(cr_abc.feedback,0,50);
recv(client_fd,&cr_abc,sizeof(cr_abc),0);
printf("%s\n",cr_abc.feedback);
if(!strcmp(cr_abc.feedback,"注销成功!"));
{
printf("请重新登陆账号\n");
goto next;
}
break;
case 0:
return 0;
break;
default:
printf("输入错误");
break;
}
}
}
else
{
while(1){
printf("1.禁言 2.解除禁言 3.踢人 4.解除踢人 0.退出管理(只执行一次)\n");
scanf("%d",&a);
getchar();
switch (a)
{
case 1:
cw_abc.type = 'J';
printf("请输入要禁言人的名字\n");
scanf("%s",cw_abc.t_buf);
getchar();
send(client_fd,&cw_abc,sizeof(cw_abc),0);
memset(cr_abc.feedback,0,50);
recv(client_fd,&cr_abc,sizeof(cr_abc),0);
printf("接收:%s\n",cr_abc.feedback);
if(!strcmp(cr_abc.feedback,"查询账号成功"))
{
printf("是否禁言[%s账号:%d](y/n)\n",cw_abc.t_buf,cr_abc.s_ID);
Y_N = getchar();
if(Y_N == 'n')
continue;
cw_abc.type = 'j';
cw_abc.s_ID = cr_abc.s_ID;
send(client_fd,&cw_abc,sizeof(cw_abc),0);
memset(cr_abc.feedback,0,50);
recv(client_fd,&cr_abc,sizeof(cr_abc),0);
printf("%s\n",cr_abc.feedback);
}
break;
case 2:
cw_abc.type = 'J';
printf("请输入要解除禁言人的名字\n");
scanf("%s",cw_abc.t_buf);
getchar();
memset(cr_abc.feedback,0,50);
send(client_fd,&cw_abc,sizeof(cw_abc),0);
recv(client_fd,&cr_abc,sizeof(cr_abc),0);
printf("接收:%s\n",cr_abc.feedback);
if(!strcmp(cr_abc.feedback,"查询账号成功"))
{
printf("是否解除禁言[%s账号:%d](y/n)\n",cw_abc.t_buf,cr_abc.s_ID);
Y_N = getchar();
if(Y_N == 'n')
continue;
cw_abc.type = 'X';
cw_abc.s_ID = cr_abc.s_ID;
send(client_fd,&cw_abc,sizeof(cw_abc),0);
memset(cr_abc.feedback,0,50);
recv(client_fd,&cr_abc,sizeof(cr_abc),0);
printf("%s\n",cr_abc.feedback);
}
break;
case 3:
cw_abc.type = 'T';
printf("请输入要踢那个账号\n");
scanf("%d",&cw_abc.s_ID);
getchar();
send(client_fd,&cw_abc,sizeof(cw_abc),0);
memset(cr_abc.feedback,0,50);
recv(client_fd,&cr_abc,sizeof(cr_abc),0);
printf("接收:%s\n",cr_abc.feedback);
if(!strcmp(cr_abc.feedback,"查询账号成功"))
{
printf("是否要踢出[姓名:%s 账号:%d](y/n)",cr_abc.name,cw_abc.s_ID);
Y_N = getchar();
if(Y_N == 'n')
break;
cw_abc.type = 't';
send(client_fd,&cw_abc,sizeof(cw_abc),0);
memset(cr_abc.feedback,0,50);
recv(client_fd,&cr_abc,sizeof(cr_abc),0);
printf("%s\n",cr_abc.feedback);
}
break;
case 4:
cw_abc.type = 'g';
printf("要解除那个账号:\n");
scanf("%d",&cw_abc.s_ID);
send(client_fd,&cw_abc,sizeof(cw_abc),0);
memset(cr_abc.feedback,0,50);
recv(client_fd,&cr_abc,sizeof(cr_abc),0);
printf("%s\n",cr_abc.feedback);
break;
case 0:
return 0;
break;
default:
printf("输入错误");
break;
}
}
}
//创建线程
// res = pthread_create(&id,NULL,F_fun,NULL);
// while (1)
// {
// recv(client_fd,r_buf,sizeof(r_buf),0);
// printf("\n接收:%s\n",r_buf);
// }
return 0;
}
//副线程
void *F_fun(void *p)
{
printf("进入聊天室\n");
while (1)
{
memset(cw_abc.t_buf,0,sizeof(cw_abc.t_buf));
printf("发送(quit退出):");
scanf("%s",cw_abc.t_buf);
getchar();
L_time();
strcpy(cw_abc.name,name);
cw_abc.tjz = tjz;
sprintf(cw_abc.feedback,"查询账号成功");
//printf("发送套接字:%d\n",tjz);
send(client_fd,&cw_abc,sizeof(cw_abc),0);
if(!strcmp(cw_abc.t_buf,str))
break;
printf("\033[0;32m[*本用户*(%s)]:%s\033[0m\n",cw_abc.name,cw_abc.t_buf);
}
}
void *F_fun1(void *p)
{
printf("进入私聊\n");
while (1)
{
memset(cw_abc.t_buf,0,sizeof(cw_abc.t_buf));
cw_abc.type = 's';
cw_abc.tjz = tjz;
printf("[私聊]发送(quit退出私聊):\n");
scanf("%s",cw_abc.t_buf);
getchar();
L_time();
strcpy(cw_abc.name,name);
send(client_fd,&cw_abc,sizeof(cw_abc),0);
if(!strcmp(cw_abc.t_buf,str))
break;
//printf("[*本用户*(%s)]:%s\n",cw_abc.name,cw_abc.t_buf);
}
}
//时间
void L_time()
{
time_t currentTime;//时间
struct tm *localTime;
// 获取当前系统时间
currentTime = time(NULL);
// 将当前时间转换为本地时间
localTime = localtime(¤tTime);
//显示时间
printf("\033[0;36m%d-%02d-%02d %02d:%02d:%02d\033[0m\n",
localTime->tm_year + 1900,
localTime->tm_mon + 1,
localTime->tm_mday,
localTime->tm_hour,
localTime->tm_min,
localTime->tm_sec);
sprintf(cw_abc.L_time,"%d-%02d-%02d %02d:%02d:%02d",
localTime->tm_year + 1900,
localTime->tm_mon + 1,
localTime->tm_mday,
localTime->tm_hour,
localTime->tm_min,
localTime->tm_sec);
}
void L_time1()
{
time_t currentTime;//时间
struct tm *localTime;
// 获取当前系统时间
currentTime = time(NULL);
// 将当前时间转换为本地时间
localTime = localtime(¤tTime);
// //显示时间
// printf("\033[0;36m%d-%02d-%02d %02d:%02d:%02d\033[0m\n",
// localTime->tm_year + 1900,
// localTime->tm_mon + 1,
// localTime->tm_mday,
// localTime->tm_hour,
// localTime->tm_min,
// localTime->tm_sec);
sprintf(cr_abc.L_time,"%d-%02d-%02d %02d:%02d:%02d",
localTime->tm_year + 1900,
localTime->tm_mon + 1,
localTime->tm_mday,
localTime->tm_hour,
localTime->tm_min,
localTime->tm_sec);
}
//菜单
int menu()
{
int a;
printf("\033[0;34m+================================================================+\033[0m\n");
printf("\033[0;34m| |\033[0m\n");
printf("\033[0;34m|***********************\033[0;33m欢迎来到小辉聊天室\033[0;34m***********************|\033[0m\n");
printf("\033[0;34m| 版本:1.0 |\033[0m\n");
printf("\033[0;34m|----------------------------------------------------------------|\033[0m\n");
printf("\033[0;34m| |\033[0m\n");
printf("\033[0;34m| \033[0;36m1.用户登录 \033[0;34m|\033[0m\n");
printf("\033[0;34m| |\033[0m\n");
printf("\033[0;34m| \033[0;36m2.帐号注册 \033[0;34m|\033[0m\n");
printf("\033[0;34m| |\033[0m\n");
printf("\033[0;34m| \033[0;33m3.管理员登录 \033[0;34m|\033[0m\n");
printf("\033[0;34m| |\033[0m\n");
printf("\033[0;34m| \033[0;31m 0:退出聊天室 \033[0;34m|\033[0m\n");
printf("\033[0;34m| |\033[0m\n");
printf("\033[0;34m+================================================================+\033[0m\n");
printf("请输入你的选择:\n");
scanf("%d",&a);
return a;
}