#include"commond.h"
int login_Menu(void);
void del_Accout(void);
void login_Accout(void);
void register_Accout(void);
int after_Login_Menu(void);
void* group_Write(void *arg);
void* Read(void *arg);
void groupChat(void);
void privateChat(void);
void* pri_Write(void *arg);
void quit_Login(void);
void chat_Log(void);
int after_Group_Chat_Menu(void);
void admin_Account(void);
int isAdmin(void);
void setAdmin(void);
void mushin_user(void);
void kick_user(void);
struct clifdId uid[50];
struct User user;
int socfd;
int count_account=1;
MYSQL *con;
int main()
{
socfd = socket(AF_INET,SOCK_STREAM,0);
if(socfd == -1)
{
perror("socfd");
return -1;
}
con = mysql_init(NULL);
if(mysql_real_connect(con,"localhost","root","1","ChatRooms",0,NULL,0) == NULL)
{
printf("数据库连接失败\n");
return -1;
}
struct sockaddr_in self;
self.sin_family = AF_INET;
self.sin_addr.s_addr = inet_addr(IP);
self.sin_port = htons(PORT);
connect(socfd,(struct sockaddr*)(&self),sizeof(self));
while(1)
{
switch(login_Menu())
{
case REGISTER: register_Accout();break;
case LOGIN:login_Accout();break;
case DEL:del_Accout();break;
case EXIT:return 0;break;
default:printf("输入错误\n");
}
}
return 0;
}
void register_Accout(void)
{
printf("********注册功能********\n");
printf("请输入用户名\n");
scanf("%s",user.name);
getchar();
printf("请输入密码\n");
scanf("%s",user.passwd);
getchar();
user.change = REGISTER;
user.status=0;
send(socfd,&user,sizeof(user),0);
recv(socfd,&user,sizeof(user),0);
printf("注册的账号:%d\t注册的用户名:%s\t注册的密码:%s,user.info:%s\n",user.id,user.name,user.passwd,user.info);
printf("%s\n",user.info);
}
void del_Accout(void)
{
printf("********注销功能********\n");
printf("请输入要删除的账号:\n");
scanf("%d",&user.id);
getchar();
printf("请输入要删除账号的密码:\n");
scanf("%s",user.passwd);
getchar();
user.change = DEL;
send(socfd,&user,sizeof(user),0);
recv(socfd,&user,1000,0);
sleep(1);
printf("%s\n",user.info);
}
void login_Accout(void)
{
printf("********登陆功能********\n");
loop:
printf("请输入账号:\n");
scanf("%d",&user.id);
getchar();
printf("请输入密码:\n");
scanf("%s",user.passwd);
getchar();
user.change = LOGIN;
send(socfd,&user,sizeof(user),0);
int re =recv(socfd,&user,1000,0);
printf("%s\n",user.info);
if(strcmp(user.info,"登陆成功")!=0)
{
goto loop;
}
count_account++;
while(1)
{
switch(after_Login_Menu())
{
case GROUPCHAT-3:
user.change = GROUPCHAT;
memset(user.f_write,0,100);
strcpy(user.f_write,"join");
send(socfd,&user,sizeof(user),0);
groupChat();
break;
case PRIVATECHAT-3:privateChat();break;
case CHAT_LOG-3:chat_Log();break;
case ADMIN-4:admin_Account();break;
case EXIT:quit_Login();return;break;
default:printf("输入错误\n");
}
}
}
void admin_Account(void)
{
printf("---------管理员页面-------\n");
while(1)
{
switch(after_Group_Chat_Menu())
{
case SETADMIN-8: setAdmin();break;
case MUSHIN-8:mushin_user();break;
case KICK-8:kick_user();break;
case EXIT:return;break;
default:printf("输入错误\n");
}
}
}
void kick_user(void)
{
printf("---------管理员设置踢人功能-------\n");
int isadmin = isAdmin();
if(isadmin == 1)
{
printf("请输入要踢人的账户\n");
scanf("%d",&user.sjid);
getchar();
user.change=KICK;
send(socfd,&user,sizeof(user),0);
recv(socfd,&user,sizeof(user),0);
printf("%s\n",user.info);
}
else if(isadmin == -1)
{
printf("你不是管理员,无权操作\n");
}
}
void mushin_user(void)
{
printf("---------管理员设置禁言功能-------\n");
int isadmin = isAdmin();
if(isadmin == 1)
{
printf("请输入要禁言的账户\n");
scanf("%d",&user.sjid);
getchar();
user.change=MUSHIN;
send(socfd,&user,sizeof(user),0);
recv(socfd,&user,sizeof(user),0);
printf("%s\n",user.info);
}
else if(isadmin == -1)
{
printf("你不是管理员,无权操作\n");
}
}
void setAdmin(void)
{
printf("---------设置管理员功能-------\n");
int isadmin = isAdmin();
if(isadmin == 1)
{
printf("请输入要设置的管理员的ID\n");
scanf("%d",&user.sjid);
getchar();
user.change = SETADMIN;
send(socfd,&user,sizeof(user),0);
recv(socfd,&user,sizeof(user),0);
printf("%s\n",user.info);
}
else if(isadmin == -1)
{
printf("你不是管理员,无权操作\n");
}
}
int isAdmin(void)
{
user.change=ISADMIN;
send(socfd,&user,sizeof(user),0);
recv(socfd,&user,sizeof(user),0);
printf("%s\n",user.info);
if(strcmp(user.info,"该账户是管理员")==0)
return 1;
else
return -1;
}
void chat_Log(void)
{
printf("********查看聊天记录功能********\n");
int filefd = open("./Account/ChatLog.txt",O_CREAT|O_RDONLY,0644);
if(filefd == -1)
{
perror("filefd");
return;
}
while(read(filefd,&user,sizeof(user)))
{
printf("%s %d用户发送:%s\n",user.time_buf,user.id,user.f_write);
}
close(filefd);
}
void quit_Login(void)
{
printf("正在下线...\n");
user.status=0;
user.change=QUIT_LOGIN;
send(socfd,&user,sizeof(user),0);
}
void* group_Write(void *arg)
{
while(1)
{
printf("请输入:\n");
scanf("%s",user.f_write);
getchar();
user.change = GROUPCHAT;
send(socfd,&user,sizeof(user),0);
if(!strcmp(user.f_write,"xl"))
{
pthread_exit(NULL);
}
}
}
void* Read(void *arg)
{
time_t t;
struct tm *local = NULL;
while(1)
{
int re = recv(socfd,&user,sizeof(user),0);
if(!strcmp(user.f_write,"xl"))
{
pthread_exit(NULL);
}
t=time(NULL);
local = localtime(&t);
if(strcmp(user.f_write,"join")!=0&&(user.admin!=-2)&&(user.admin!=-1))
{
printf("%d.%d.%d %d:%d:%d\t",
local->tm_year+1900,local->tm_mon+1,local->tm_mday,
local->tm_hour,local->tm_min,local->tm_sec);
printf("用户:%d 发来的:%s\n",user.id,user.f_write);
}
}
}
void groupChat(void)
{
printf("********群聊功能********\n");
pthread_t pt1,pt2;
pthread_create(&pt1,NULL,group_Write,NULL);
pthread_create(&pt2,NULL,Read,NULL);
pthread_join(pt1,NULL);
pthread_join(pt2,NULL);
}
void* pri_Write(void *arg)
{
int i=1,sjid=0;
while(1)
{
if(i==1)
{
printf("请输入要私聊的账号:\n");
scanf("%d",&sjid);
getchar();
}
printf("请输入私聊信息:\n");
scanf("%s",user.f_write);
getchar();
user.sjid=sjid;
user.change = PRIVATECHAT;
send(socfd,&user,sizeof(user),0);
if(!strcmp(user.f_write,"xl"))
{
pthread_exit(NULL);
}
i=2;
}
}
void privateChat(void)
{
printf("********私聊功能********\n");
char buf_status[200];
memset(buf_status,0,100);
sprintf(buf_status,"select id from chatroom where status =1");
mysql_real_query(con,buf_status,strlen(buf_status));
MYSQL_RES* res = mysql_store_result(con);
int r = mysql_num_rows(res);
if(r == 0)
{
printf("没有在线的账号\n");
return;
}
char **a =NULL;
while(--r>=0)
{
a= mysql_fetch_row(res);
printf("账号:%s\n",a[0]);
}
pthread_t pt3,pt4;
pthread_create(&pt3,NULL,pri_Write,NULL);
pthread_create(&pt4,NULL,Read,NULL);
pthread_join(pt3,NULL);
pthread_join(pt4,NULL);
}
int login_Menu(void)
{
printf("\033[2J");
printf("\033[0;0H");
printf("--------1、注册--------\n");
printf("--------2、登陆--------\n");
printf("--------3、注销--------\n");
printf("--------0、退出--------\n");
int change =0;
scanf("%d",&change);
getchar();
return change;
}
int after_Login_Menu(void)
{
printf("--------1、 群聊------------\n");
printf("--------2、 私聊------------\n");
printf("--------3、查看聊天记录-------\n");
printf("--------4、管理员页面---------\n");
printf("--------0、 退出------------\n");
int change =0;
scanf("%d",&change);
getchar();
return change;
}
int after_Group_Chat_Menu(void)
{
printf("--------1、设置管理员--------\n");
printf("--------2、禁言--------\n");
printf("--------3、踢人--------\n");
printf("--------0、退出--------\n");
int change =0;
scanf("%d",&change);
getchar();
return change;
}
```c
#include"commond.h"
int isKick(void);
int isMushin(void);
void chat_Log(struct User user);
int open_Account(void);
struct User user;
struct clifdId uid[50];
struct SiL sil;
struct clifdId qunl[50];
MYSQL *con;
int main()
{
int socfd = socket(AF_INET,SOCK_STREAM,0);
if(socfd == -1)
{
perror("socfd");
return -1;
}
int val=1;
setsockopt(socfd,SOL_SOCKET,SO_REUSEADDR,&val,sizeof(val));
con = mysql_init(NULL);
if(mysql_real_connect(con,"localhost","root","1","ChatRooms",0,NULL,0) == NULL)
{
printf("数据库连接失败\n");
return -1;
}
struct sockaddr_in self;
self.sin_family = AF_INET;
self.sin_addr.s_addr = inet_addr(IP);
self.sin_port = htons(PORT);
int bd = bind(socfd,(struct sockaddr*)(&self),sizeof(self));
if(bd == -1)
{
perror("bd");
return -1;
}
listen(socfd,50);
int zf_flag=0;
int change = 0;
int buf_clifd[50]={0};
struct sockaddr_in cli_addr;
int len = sizeof(cli_addr);
int ret=0,clifd[50]={0},count=0,logincount=0,row=0,groupcount=0;
int maxfd = socfd;
fd_set readset,fdset;
FD_ZERO(&readset);
FD_SET(socfd,&readset);
fdset = readset;
while(1)
{
readset = fdset;
ret = select(maxfd+1,&readset,NULL,NULL,NULL);
if(ret == -1)
{
perror("select");
return -1;
}
if(FD_ISSET(socfd,&readset))
{
clifd[count] = accept(socfd,(struct sockaddr *)(&cli_addr),&len);
printf("%d上线\n",clifd[count]);
FD_SET(clifd[count],&fdset);
if(clifd[count]>maxfd)
maxfd=clifd[count];
count++;
if(ret == 1)
continue;
}
time_t t;
struct tm *local = NULL;
int re=0,ff=0;
char buf_info[100]={0},buf_status[100];
for(int i=0;i<count;i++)
{
if(FD_ISSET(clifd[i],&readset))
{
int readrcv = recv(clifd[i],&user,sizeof(user),0);
if(clifd[i]==uid[i].clifd)
user.id=uid[i].id;
if(readrcv==0)
{
memset(&user,0,sizeof(user));
}
switch(user.change)
{
case REGISTER:
{
user.id = open_Account();
char buf[1000]={0},buf_info[100]={0};
sprintf(buf,"insert into chatroom values('%s',%d,'%s',%d,%d)",
user.name,user.id,user.passwd,user.status,0);
mysql_real_query(con,buf,strlen(buf));
printf("注册成功\n");
strcpy(user.info,"注册成功\n");
send(clifd[i],&user,sizeof(user),0);
break;
}
case LOGIN:
{
char buf_login[1000]={0};
sprintf(buf_login,"select passwd from chatroom where id =%d",user.id);
mysql_real_query(con,buf_login,strlen(buf_login));
MYSQL_RES* res = mysql_store_result(con);
row = mysql_num_rows(res);
if(row == 0)
{
printf("没找到该账号\n");
strcpy(user.info,"没找到该账号");
send(clifd[i],&user,sizeof(user),0);
break;
}
char **a =mysql_fetch_row(res);
if(strcmp(user.passwd,a[0])==0)
{
printf("登陆成功\n");
strcpy(user.info,"登陆成功");
send(clifd[i],&user,sizeof(user),0);
sprintf(buf_status,"update chatroom set status=1 where id = %d",user.id);
mysql_real_query(con,buf_status,strlen(buf_status));
uid[logincount].clifd=clifd[i];
uid[logincount].id=user.id;
logincount++;
printf("logincount: %d\n",logincount);
}
else
{
printf("密码错误\n");
strcpy(user.info,"密码错误");
send(clifd[i],&user,sizeof(user),0);
}
break;
}
case QUIT_LOGIN:
{
sprintf(buf_status,"update chatroom set status=0 where id = %d",user.id);
mysql_real_query(con,buf_status,strlen(buf_status));
if(logincount>0)
logincount--;
printf("退出登陆成功\n");
break;
}
case GROUPCHAT:
{
user.sjid=user.id;
int iskick = isKick();
printf("178userid %d\n",user.id);
if(iskick==-1)
{
printf("该用户被踢出\n");
strcpy(user.info,"该用户被踢出");
user.admin=-1;
send(clifd[i],&user,sizeof(user),0);
continue;
}
user.sjid=user.id;
int ismushin = isMushin();
printf("190userid %d\n",user.id);
if(ismushin==-2)
{
printf("该用户禁言\n");
}
ff=0;
for(int y=0;y<groupcount;y++)
{
if(qunl[y].clifd==clifd[i])
{
ff=1;
break;
}
}
if(ff==0)
{
qunl[groupcount].id=user.id;
qunl[groupcount].clifd=clifd[i];
groupcount++;
}
t=time(NULL);
local = localtime(&t);
sprintf(user.time_buf,"%d.%d.%d %d:%d:%d\t",
local->tm_year+1900,local->tm_mon+1,local->tm_mday,
local->tm_hour,local->tm_min,local->tm_sec);
chat_Log(user);
if(clifd[i]==uid[i].clifd)
user.id=uid[i].id;
for(int j=0;j<=groupcount;j++)
{
if((strcmp(user.f_write,"xl")==0)&&(qunl[j].clifd==clifd[i]))
{
send(clifd[i],&user,sizeof(user),0);
for(int y=0;y<groupcount;y++)
{
if(clifd[i]==qunl[y].clifd)
{
qunl[y].clifd=0;
qunl[y].id=0;
}
}
break;
}
else if((qunl[j].clifd!=clifd[i])&&clifd[i]>0&&(strcmp(user.f_write,"xl")!=0)&&(ismushin!=-2))
{
send(qunl[j].clifd,&user,sizeof(user),0);
printf("218:%d发送给客户端:%d: 发送内容:%s\n",clifd[i],clifd[j],user.f_write);
}
if(ismushin==-2)
{
user.admin=-2;
strcpy(user.info,"该用户禁言");
send(socfd,&user,sizeof(user),0);
}
}
break;
}
case PRIVATECHAT:
{
int n=0,flag=0;
sil.sjid=user.sjid;
sil.sfid=user.id;
sil.fclifd=clifd[i];
flag=0;
for(int s=0;s<logincount;s++)
{
if(strcmp(user.f_write,"xl")==0)
{
send(clifd[i],&user,sizeof(user),0);
break;
}
else if(sil.sjid==uid[s].id)
{
sil.jclifd=uid[s].clifd;
re = send(sil.jclifd,&user,sizeof(user),0);
printf("160:send %d %d发送给客户端:%d: 发送内容:%s\n",re,clifd[i],sil.jclifd,user.f_write);
flag=1;
break;
}
}
if(flag!=1)
{
printf("该账号没在线\n");
}
break;
}
case DEL:
{
char buf_search[1000]={0},buf_del[1000];
sprintf(buf_search,"select passwd from chatroom where id =%d",user.id);
mysql_real_query(con,buf_search,strlen(buf_search));
MYSQL_RES* res = mysql_store_result(con);
row = mysql_num_rows(res);
if(row == 0)
{
strcpy(user.info,"没找到该账户");
send(clifd[i],&user,sizeof(user),0);
break;
}
char **a =mysql_fetch_row(res);
if(strcmp(user.passwd,a[0])==0)
{
sprintf(buf_del,"delete from chatroom where id= %d",user.id);
mysql_real_query(con,buf_del,strlen(buf_del));
printf("删除成功\n");
strcpy(user.info,"删除成功");
send(clifd[i],&user,sizeof(user),0);
}
break;
}
case KICK:
{
char buf_kick[1000]={0};
sprintf(buf_kick,"update chatroom set admin=-1 where id = %d",user.sjid);
mysql_real_query(con,buf_kick,strlen(buf_kick));
strcpy(user.info,"踢出成功");
send(clifd[i],&user,sizeof(user),0);
break;
}
case MUSHIN:
{
char buf_setmushin[1000]={0};
sprintf(buf_setmushin,"update chatroom set admin=-2 where id = %d",user.sjid);
mysql_real_query(con,buf_setmushin,strlen(buf_setmushin));
strcpy(user.info,"禁言成功");
send(clifd[i],&user,sizeof(user),0);
break;
}
case SETADMIN:
{
char buf_setadmin[1000]={0};
sprintf(buf_setadmin,"update chatroom set admin=1 where id = %d",user.sjid);
mysql_real_query(con,buf_setadmin,strlen(buf_setadmin));
strcpy(user.info,"设置成功");
send(clifd[i],&user,sizeof(user),0);
break;
}
case ISADMIN:
{
char buf_admin_search[1000]={0};
sprintf(buf_admin_search,"select admin from chatroom where id =%d",user.id);
mysql_real_query(con,buf_admin_search,strlen(buf_admin_search));
MYSQL_RES* res = mysql_store_result(con);
row = mysql_num_rows(res);
if(row == 0)
{
strcpy(user.info,"该账户不是管理员");
send(clifd[i],&user,sizeof(user),0);
break;
}
char **a =mysql_fetch_row(res);
if(strcmp("1",a[0])==0)
{
printf("该账户是管理员\n");
strcpy(user.info,"该账户是管理员");
send(clifd[i],&user,sizeof(user),0);
}
else
{
printf("该账户不是管理员\n");
strcpy(user.info,"该账户不是管理员");
send(clifd[i],&user,sizeof(user),0);
}
break;
}
case EXIT:break;
default:printf("输入错误\n");
}
}
}
}
}
int isKick(void)
{
int row=0;
char buf_kick[1000]={0};
sprintf(buf_kick,"select admin from chatroom where id =%d",user.sjid);
mysql_real_query(con,buf_kick,strlen(buf_kick));
MYSQL_RES* res = mysql_store_result(con);
row = mysql_num_rows(res);
char **a =mysql_fetch_row(res);
if(strcmp("-1",a[0])==0)
return -1;
else
return 1;
}
int isMushin(void)
{
int row=0;
char buf_jinyan[1000]={0};
sprintf(buf_jinyan,"select admin from chatroom where id =%d",user.sjid);
mysql_real_query(con,buf_jinyan,strlen(buf_jinyan));
MYSQL_RES* res = mysql_store_result(con);
row = mysql_num_rows(res);
char **a =mysql_fetch_row(res);
if(strcmp("-2",a[0])==0)
return -2;
else
return 1;
}
void chat_Log(struct User user)
{
int filefd = open("./Account/ChatLog.txt",O_CREAT|O_WRONLY|O_APPEND,0644);
if(filefd == -1)
{
perror("filefd");
return;
}
write(filefd,&user,sizeof(user));
close(filefd);
}
int open_Account(void)
{
int cur_id = 1000;
int filefd = open("./Account/account.txt",O_CREAT|O_RDWR,0644);
if(filefd == -1)
{
perror("filefd");
return -1;
}
read(filefd,&cur_id,sizeof(int));
cur_id++;
lseek(filefd,SEEK_SET,0);
write(filefd,&cur_id,sizeof(int));
close(filefd);
return cur_id;
}
#ifndef _COMMOND_H_
#define _COMMOND_H_
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <string.h>
#include <stdio.h>
#include <pthread.h>
#include <sys/time.h>
#include <unistd.h>
#include<mysql/mysql.h>
#include<string.h>
#include <fcntl.h>
#include<time.h>
#define IP "127.0.0.1"
#define PORT 23456
enum {EXIT,REGISTER,LOGIN,DEL,GROUPCHAT,PRIVATECHAT,CHAT_LOG,QUIT_LOGIN,ADMIN,SETADMIN,MUSHIN,KICK,ISADMIN,};
struct User
{
int admin;
int id;
int sjid;
int sfid;
char name[20];
char passwd[20];
char info[100];
int change;
char f_write[500];
int status;
char time_buf[100];
};
struct clifdId
{
int id;
int clifd;
};
struct SiL
{
int sjid;
int sfid;
int fclifd;
int jclifd;
};
#endif