服务器方面
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <stdlib.h>
#include <mysql/mysql.h>
#include <time.h>
#include <netinet/in.h>
#include <unistd.h>
#include <pthread.h>
#define PORT 55556
#define IP "127.0.0.1"
#include <signal.h>
int max=0;
int cfd[20]={0};
int count=0;
struct per
{
char siliao[256];//不在线----私聊
char name[24];//姓名
char zhanghao[24];//账号
char passwd[24];//密码
char type;//消息类型
char Cmd[24];//管理员身份运行
int id;//聊天对象的id
char online[16];//在线状态
char r_buf[128];//读取入的信息
char w_buf[128];//写入的信息-----群聊
int FD;
}per;
int Register();
int Log_on(int fd,int i);
int Log_off(int fd);
int Double(int fd);
int Signle(int fd);
void Fun();
int log_cmd(int fd,int i);//管理员登录
void chat_out(int fd);//踢人
void chat_no_speak(int fd);//禁言单个
MYSQL sql;
int main()
{
mysql_init(&sql);
signal(2,Fun);//通过监测服务器当输入ctrl+c时会运行Fun函数,来进行数据库内的数据清理
//1.创建套接字
int sfd=socket(AF_INET,SOCK_STREAM,0);
if(sfd==-1)
{
perror("socket");
return -1;
}
int val=1;//自动清理端口被占用
setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&val,sizeof(val));
setsockopt(sfd,SOL_SOCKET,SO_REUSEPORT,&val,sizeof(val));
//2.绑定
struct sockaddr_in s_addr;
s_addr.sin_family=AF_INET;
s_addr.sin_port=htons(PORT);
s_addr.sin_addr.s_addr=inet_addr(IP);
int res=bind(sfd,(struct sockaddr *)&s_addr,sizeof(s_addr));
if(res==-1)
{
perror("bind");
return -1;
}
//3.监听
res=listen(sfd,20);
if(res==-1)
{
perror("listen");
return -1;
}
struct sockaddr_in c_addr;//用于连接时所需绑定的端口和ip
socklen_t len=sizeof(c_addr);
max=sfd;
fd_set table;//创建操作表
fd_set bf_table;//备份
FD_ZERO(&bf_table);//清空操作表
FD_SET(sfd,&bf_table);//将sfd添加到操作表中
//1.创建并初始化中心结构体
mysql_init(&sql);
//2.连接结构体
MYSQL *sqls=mysql_real_connect(&sql,"localhost","root","1","chat_room",0,NULL,0);
if(&sqls==NULL)
{
printf("数据库连接失败\n");
return -1;
}
//3.操作数据库
char r_buf[128]={0};
char w_buf[128]={0};
while(1)
{
table=bf_table;//将备份表里的内容给操作表
res = select(max+1,&table,NULL,NULL,NULL);
if(FD_ISSET(sfd,&table))//如果判断为真成立说明要连接
{
cfd[count]=accept(sfd,(struct sockaddr *)&c_addr,&len);
max=(max>cfd[count])?max:cfd[count];
//时刻保存select第一个参数是套接字中最大的
FD_SET(cfd[count],&bf_table);
count++;
//把新连接的套接字放入备份表中
if(res==1)//说明操作表内只有一个套接字 sfd
{
continue;
}
}
//到此处说明操作表内不只一个套接字
//有人要发消息情况
int i=0;
for(i=0;i<count;i++)//判断是谁发消息
{
if(FD_ISSET(cfd[i],&table))
{
memset(&per,0,sizeof(per));
int a=read(cfd[i],&per,sizeof(per));
printf("per.type = %c\n",per.type);
if(a>0)
{
switch(per.type)
{
case 't':chat_out(cfd[i]);write(cfd[i],&per,sizeof(per));break;
case '1':Register();write(cfd[i],&per,sizeof(per));break;//注册
case '2':Log_on(cfd[i],i);break;//登陆
case '3':Log_off(cfd[i]);write(cfd[i],&per,sizeof(per));break;//注销
case '4':Signle(cfd[i]);break;//私聊
case '5':
per.FD=cfd[i];
char buf[128]={0};
sprintf(buf,"select 姓名 from chat_rooms where FD=%d;",per.FD);//通过FD找到后修改其行中FD,在线状态
mysql_query(&sql,buf);
MYSQL_RES *res=mysql_store_result(&sql);
//遍历出是谁的消息
char **p=mysql_fetch_row(res);
int hang = mysql_num_rows(res);
int lie = mysql_num_fields(res);
for(int k=0;k<hang;k++)
{
for(int w=0;w<lie;w++)
{
int hang = mysql_num_rows(res);
char temp[128]={0};
memset(temp,0,sizeof(temp));
sprintf(temp,"%s说:",p[0]);
strcat(temp,per.w_buf);
sprintf(per.w_buf,temp,sizeof(temp));
for(int r=0;r<20;r++)//所有人不管在不在线都发
{
if(k!=cfd[i])//除发的本人外都发送
{
write(cfd[r],&per,sizeof(per));
}
}
}
}
break;//群聊
case 'g':log_cmd(cfd[i],i);break;
}
}
if(a==0)//说明对方有客户端离线
{
FD_CLR(cfd[i],&bf_table);
char buf[128]={0};
sprintf(buf,"select * from chat_rooms where FD=%d;",cfd[i]);//通过FD找到后修改其行中FD,在线状态
mysql_query(&sql,buf);
MYSQL_RES *res=mysql_store_result(&sql);
int hang = mysql_num_rows(res);
if(hang != 0)
{
memset(per.online,0,sizeof(per.online));
sprintf(per.online,"离线");
char **p=mysql_fetch_row(res);
for(int k=0;k<count;k++)//除发的本人外都发送下线通知
{
if(k!=i)
{
per.type='5';//通过群聊的方式发送给别人
memset(per.w_buf,0,sizeof(per.w_buf));
sprintf(per.w_buf,"%s说:%s已下线",p[0],p[0]);
write(cfd[k],&per,sizeof(per));
}
}
sprintf(buf,"update chat_rooms set online='离线',FD=-1 where FD=%d;",cfd[i]);//通过查找FD修改相应的信息
mysql_query(&sql,buf);
}
for(int j=i;j<count;j++)//去除已下线的
{
cfd[j]=cfd[j+1];
}
count--;
}
}
}
}
return 0;
}
void chat_no_speak(int fd)//禁言单个
{
//判断是否在线
char buf[128]={0};
sprintf(buf,"select * from chat_rooms where 账号='%s';",per.zhanghao);//通过FD找到后修改其行中FD,在线状态
mysql_query(&sql,buf);
MYSQL_RES *res=mysql_store_result(&sql);
int hang = mysql_num_rows(res);
if(hang!=0)//说明该账号存在
{
char **p=mysql_fetch_row(res);
if(strcmp(p[4],"离线")==0)//说明该账号目前不在线
{
memset(per.zhanghao,0,sizeof(per.zhanghao));
sprintf(per.zhanghao,"该账号目前不在线");
per.type='g';//错误的话信息通过g发给客户端
}
else
{
sprintf(buf,"update chat_rooms set FD=-1, where 账号='%s';",per.zhanghao);//修改相应的信息
mysql_query(&sql,buf);
memset(per.zhanghao,0,sizeof(per.zhanghao));
sprintf(per.zhanghao,"%s账号已被禁言",per.zhanghao);
}
}
}
void chat_out(int fd)//踢下线
{
//判断是否在线
char buf[128]={0};
sprintf(buf,"select * from chat_rooms where 账号='%s';",per.zhanghao);//通过FD找到后修改其行中FD,在线状态
mysql_query(&sql,buf);
MYSQL_RES *res=mysql_store_result(&sql);
int hang = mysql_num_rows(res);
if(hang!=0)//说明该账号存在
{
char **p=mysql_fetch_row(res);
if(strcmp(p[4],"离线")==0)//说明该账号目前不在线
{
memset(per.zhanghao,0,sizeof(per.zhanghao));
sprintf(per.zhanghao,"该账号目前不在线");
per.type='g';//错误的话信息通过g发给客户端
}
else
{
sprintf(buf,"update chat_rooms set FD=-1,online='离线' where 账号='%s';",per.zhanghao);//修改相应的信息
mysql_query(&sql,buf);
memset(per.zhanghao,0,sizeof(per.zhanghao));
sprintf(per.zhanghao,"该账号已被清理下线");
kill(atoi(p[5]),9);
}
}
}
int log_cmd(int fd,int i)//管理员登录
{
char buf[128]={0};
//查找表里的内容,判断账号是否存在
memset(buf,0,sizeof(buf));
sprintf(buf,"select * from chat_rooms where 账号='%s';",per.zhanghao);
mysql_query(&sql,buf);
MYSQL_RES *res=mysql_store_result(&sql);
if(res==NULL)
{
printf("mysql_store_result异常\n");
}
int hang=mysql_num_rows(res);
char**p=mysql_fetch_row(res);
if(hang!=0)//说明账号存在
{
if(atoi(p[3])!=-1)
{
memset(per.w_buf,0,sizeof(per.w_buf));
sprintf(per.w_buf,"账号已在线,请勿重复登陆");
per.type='2';//账户错误的话走2渠道进行打印
write(cfd[i],&per,sizeof(per));
}
if(strcmp(per.passwd,p[2])==0)//判读读取密码是否正确
{
//登陆成功后把FD和在线状态在库内进行更新------------------------
memset(buf,0,sizeof(buf));
per.FD=fd;
sprintf(per.online,"在线");
sprintf(buf,"update chat_rooms set FD=%d,online='%s',pid=%d where 账号='%s';",per.FD,per.online,per.id,per.zhanghao);//修改相应的信息
mysql_query(&sql,buf);
//客户端提示谁上线--------------------------------------------
memset(buf,0,sizeof(buf));
sprintf(buf,"select 姓名 from chat_rooms where 账号='%s';",per.zhanghao);
mysql_query(&sql,buf);
MYSQL_RES *res=mysql_store_result(&sql);
int hang=mysql_num_rows(res);
char **p=NULL;
p=mysql_fetch_row(res);
sprintf(per.name,"%s",p[0]);
printf("%d号客户端:%s已上线\n",fd,per.name);
memset(buf,0,sizeof(buf));
char buf[128]={0};
sprintf(buf,"select FD from chat_rooms where FD>0;");//通过FD找到后修改其行中FD,在线状态
mysql_query(&sql,buf);
res=mysql_store_result(&sql);
if(res==NULL)
{
printf("mysql_store_result异常\n");
}
memset(per.passwd,0,sizeof(per.passwd));
sprintf(per.passwd,"账号、密码正确");
//账号密码正确走g通道
memset(&per.type,0,sizeof(per.type));
per.type='g';
//把帐号密码信息写入密码内发给客户端------------------------------
hang = mysql_num_rows(res);
char **p1=NULL;
for(int k=0;k<hang;k++)//除发的本人外都发送上线通知
{
char **p1=mysql_fetch_row(res);
if(atoi(p1[0])!= fd)
{
memset(&per.type,0,sizeof(per.type));
per.type='5';//通过群聊的方式发送给别人--------------
memset(per.w_buf,0,sizeof(per.w_buf));
sprintf(per.w_buf,"%d%s已上线,请文明交流避免被踢。",per.FD,p[0]);
write(atoi(p1[0]),&per,sizeof(per));
}
}
}
else
{
memset(per.passwd,0,sizeof(per.passwd));
sprintf(per.passwd,"账号或密码错误");
per.type='2';//密码错误的话走2渠道进行打印
write(cfd[i],&per,sizeof(per));
}
}
else
{
memset(per.zhanghao,0,sizeof(per.zhanghao));
sprintf(per.zhanghao,"账号或密码错误");
per.type='2';//账户错误的话走2渠道进行打印
write(cfd[i],&per,sizeof(per));
//错误信息发送给本人
}
}
int Register()//注册
{
char buf[256]={0};
//生成随机账号
time_t t;
t=time(NULL);
t%=10000;
sprintf(per.zhanghao,"%ld",t);
int FD=-1;
per.FD=FD;
per.id=-1;
sprintf(per.online,"离线");
//将注册好的信息存入数据库
memset(buf,0,sizeof(buf));
sprintf(buf,"insert into chat_rooms values('%s','%s','%s',%d,'%s',%d);",per.name,per.zhanghao,per.passwd,per.FD,per.online,per.id);
mysql_query(&sql,buf);
}
int Log_on(int fd,int i)//登陆
{
char buf[128]={0};
//查找表里的内容,判断账号是否存在
memset(buf,0,sizeof(buf));
sprintf(buf,"select * from chat_rooms where 账号='%s';",per.zhanghao);
mysql_query(&sql,buf);
printf("buf1 = %s\n",buf);
MYSQL_RES *res=mysql_store_result(&sql);
if(res==NULL)
{
printf("mysql_store_result异常\n");
}
int hang=mysql_num_rows(res);
char**p=mysql_fetch_row(res);
if(hang!=0)//说明账号存在
{
printf("p[3] = %s\n",p[3]);
if(atoi(p[3])!=-1)
{
memset(per.w_buf,0,sizeof(per.w_buf));
sprintf(per.w_buf,"账号已在线,请勿重复登陆");
per.type='2';//账户错误的话走2渠道进行打印
write(cfd[i],&per,sizeof(per));
}
if(strcmp(per.passwd,p[2])==0)//判读读取密码是否正确
{
//登陆成功后把FD和在线状态在库内进行更新------------------------
memset(buf,0,sizeof(buf));
per.FD=fd;
sprintf(per.online,"在线");
sprintf(buf,"update chat_rooms set FD=%d,online='%s',pid=%d where 账号='%s';",per.FD,per.online,per.id,per.zhanghao);//修改相应的信息
mysql_query(&sql,buf);
//客户端提示谁上线--------------------------------------------
memset(buf,0,sizeof(buf));
sprintf(buf,"select 姓名 from chat_rooms where 账号='%s';",per.zhanghao);
mysql_query(&sql,buf);
printf("buf2 = %s\n",buf);
MYSQL_RES *res=mysql_store_result(&sql);
int hang=mysql_num_rows(res);
char **p=NULL;
p=mysql_fetch_row(res);
sprintf(per.name,"%s",p[0]);
printf("%d号客户端:%s已上线\n",fd,per.name);
memset(buf,0,sizeof(buf));
char buf[128]={0};
sprintf(buf,"select FD from chat_rooms where FD>0;");//通过FD找到后修改其行中FD,在线状态
mysql_query(&sql,buf);
res=mysql_store_result(&sql);
if(res==NULL)
{
printf("mysql_store_result异常\n");
}
memset(per.passwd,0,sizeof(per.passwd));
sprintf(per.passwd,"账号、密码正确");
//把帐号密码信息写入密码内发给客户端------------------------------
hang = mysql_num_rows(res);
char **p1=NULL;
for(int k=0;k<hang;k++)//除发的本人外都发送上线通知
{
char **p1=mysql_fetch_row(res);
printf("%d\n",fd);
if(atoi(p1[0])!= fd)
{
memset(&per.type,0,sizeof(per.type));
per.type='5';//通过群聊的方式发送给别人--------------
memset(per.w_buf,0,sizeof(per.w_buf));
sprintf(per.w_buf,"%d号客户端%s已上线",per.FD,p[0]);
write(atoi(p1[0]),&per,sizeof(per));
}
}
}
else
{
memset(per.passwd,0,sizeof(per.passwd));
sprintf(per.passwd,"账号或密码错误");
per.type='2';//密码错误的话走2渠道进行打印
write(cfd[i],&per,sizeof(per));
}
}
else
{
memset(per.zhanghao,0,sizeof(per.zhanghao));
sprintf(per.zhanghao,"账号或密码错误");
per.type='2';//账户错误的话走2渠道进行打印
write(cfd[i],&per,sizeof(per));
//错误信息发送给本人
}
}
int Log_off(int fd)
{
char buf[256]={0};
//查找表里的内容,判断账号是否存在
memset(buf,0,sizeof(buf));
sprintf(buf,"select 密码 from chat_rooms where 账号='%s';",per.zhanghao);
mysql_query(&sql,buf);
MYSQL_RES *res=mysql_store_result(&sql);
if(res==NULL)
{
printf("mysql_store_result异常\n");
}
int hang=mysql_num_rows(res);
if(hang!=0)//说明账号存在
{
char **p=NULL;
p=mysql_fetch_row(res);
if(strcmp(per.passwd,p[0])==0)//判断读取密码是否正确
{
memset(per.passwd,0,sizeof(per.passwd));
sprintf(per.passwd,"密码正确");
memset(buf,0,sizeof(buf));
sprintf(buf,"delete from chat_rooms where 账号='%s';",per.zhanghao);
mysql_query(&sql,buf);
sprintf(per.passwd,"账户注销完成");
}
else
{
memset(per.passwd,0,sizeof(per.passwd));
sprintf(per.passwd,"密码错误");
}
}
else
{
memset(per.zhanghao,0,sizeof(per.zhanghao));
sprintf(per.zhanghao,"账号不存在");
sprintf(per.passwd,"ERR");
}
}
int Signle(int fd)
{ int n =0;
//查找表里的内容,查找在线的人
char buf[512]={0};
memset(buf,0,sizeof(buf));
sprintf(buf,"select * from chat_rooms where 账号=%s;",per.zhanghao);//通过账号找到FD
//memset(per.zhanghao,0,sizeof(per.zhanghao));
mysql_query(&sql,buf);
MYSQL_RES *res=mysql_store_result(&sql);
if(res==NULL)
{
printf("mysql_store_result异常\n");
}
int hang=mysql_num_rows(res);
if(hang!=0)//说明已经通过行FD找到了账号
{
char **p=NULL;
p = mysql_fetch_row(res);
n =atoi(p[3]);
if(atoi(p[3])==-1)//通过FD判断是否在线
{
memset(per.siliao,0,sizeof(per.siliao));
sprintf(per.siliao,"该好友离线无法聊天");
}
}
else//账号找不到的情况
{
sprintf(per.siliao,"没有该好友");
}
write(n,per.siliao,sizeof(per.siliao));
}
void Fun()
{
char buf[128]={0};
sprintf(buf,"update chat_rooms set FD=-1,online='离线',pid=-1 where FD>0;");//修改相应的信息
mysql_query(&sql,buf);
pid_t pid=getpid();
kill(pid,9);
}
客户端
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <pthread.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#define IP "127.0.0.1"
#define PORT 55556
int Register(void);//注册
int Log_on(void);//登陆
int Log_off(void);//注销
int Signle(void);//私聊
int Double(void);//群聊
int Cmd(void);//管理员模式
int fd=0;
void *W_FUN(void *p);
void *R_FUN(void *p);
void print1(void);//一级目录
void print2(void);//二级目录
void print3(void);//三级目录
void siliao(void);
void chat_out(void);//踢出群聊
void chat_no_speak(void);//禁言
void chat_everybody_no_speak(void);//全体禁言
void chat_cancel_everybody_speak(void);//解除全体禁言
struct per
{
char siliao[256];//不在线----私聊
char name[24];//姓名
char zhanghao[24];//账号
char passwd[24];//密码
char type;//消息类型
char Cmd[24];//管理员身份运行
int id;//聊天对象的id
char online[16];//在线状态
char r_buf[128];//读取入的信息
char w_buf[128];//写入的信息-----群聊
int FD;
}per;
int main()
{
//1.创建套接字
fd=socket(AF_INET,SOCK_STREAM,0);
printf("fd = %d\n",fd);
if(fd==-1)
{
perror("socket");
return -1;
}
//2.连接
struct sockaddr_in ser_addr;
ser_addr.sin_family=AF_INET;
ser_addr.sin_addr.s_addr=inet_addr(IP);
ser_addr.sin_port=htons(PORT);
int res=connect(fd,(struct sockaddr *)&ser_addr,sizeof(ser_addr));
if(res==-1)
{
perror("connect");
return -1;
}
printf("连接成功\n");
//创建读写进程
pthread_t r_id,w_id;
pthread_create(&r_id,NULL,R_FUN,NULL);
pthread_create(&w_id,NULL,W_FUN,NULL);
pthread_join(r_id,NULL);
pthread_join(w_id,NULL);
return 0;
}
void print1(void)
{
printf("----------------------------------------\n");
printf("**************欢迎进入聊天室**************\n");
printf("**************g.管理员身份运行*************\n");
printf("**************1.注册账号*****************\n");
printf("**************2.登陆账号*****************\n");
printf("**************3.注销********************\n");
printf("**************0.退出********************\n");
printf("----------------------------------------\n");
}
void print2(void)
{
printf("----------------------------------------\n");
printf("**************选择聊天室模式**************\n");
printf("**************4.私聊********************\n");
printf("**************5.群聊********************\n");
printf("**************0.退出*********************\n");
printf("----------------------------------------\n");
}
void print3(void)
{
printf("---------------------------------------\n");
printf("**************管理员模式****************\n");
printf("**************t.踢出群聊*****************\n");
printf("**************j.单个禁言*********************\n");
printf("**************e.全体禁言*********************\n");
printf("**************J.解除单个禁言****************\n");
printf("**************E.解除全部禁言****************\n");
printf("**************0.退出********************\n");
printf("----------------------------------------\n");
}
void chat_out(void)//踢出群聊
{
printf("请输入你要踢的人的账号:\n");
memset(&per.id,0,sizeof(per.id));
pid_t pid=getpid();
per.id=(int)pid;
printf("%d\n",pid);
memset(per.zhanghao,0,sizeof(per.zhanghao));
scanf("%s",per.zhanghao);
getchar();
write(fd,&per,sizeof(per));
}
void chat_no_speak(void)//禁言
{
}
void chat_everybody_no_speak(void)//全体禁言
{
}
void chat_cancel_everybody_speak(void)//解除全体禁言
{
}
void *R_FUN(void *p)
{
time_t t=time(NULL);
struct tm *tm=localtime(&t);
struct per r_per;
while(1)
{
t=time(NULL);
p=localtime(&t);
int a=0;
memset(&r_per,0,sizeof(r_per));
a=read(fd,&r_per,sizeof(r_per));
//printf("per.type = %c\n",r_per.type);
if(a==0)
{
close(fd);
printf("退出\n");
exit(0);
}
if(r_per.type=='1')
{
printf("账号创建完成,您的账号为\n");
printf("%s\n",r_per.zhanghao);
//print1();
}
if(r_per.type=='2')
{
if(strcmp(r_per.zhanghao,"账号或密码错误")==0||strcmp(r_per.passwd,"账号或密码错误")==0)
{
printf("账号密码有误\n");
exit(0);
//print1();
}
else if(strcmp(r_per.w_buf,"账号已在线,请勿重复登陆")==0)
{
printf("%s,已退出\n",r_per.w_buf);
printf("%d时:%d分:%d秒\n",tm->tm_hour,tm->tm_min,tm->tm_sec);
exit(0);
}
else
{
printf("%s\n",r_per.passwd);
print2();
}
}
if(r_per.type=='3')
{
printf("%s\n",r_per.zhanghao);
printf("%s\n",r_per.passwd);
//print1();
}
if(strlen(r_per.siliao)!=0)//私聊
{
if(strcmp(r_per.siliao,"没有该好友")==0)
{
printf("%s\n",r_per.siliao);
printf("%d时:%d分:%d秒\n",tm->tm_hour,tm->tm_min,tm->tm_sec);
exit(0);
}
else if(strcmp(r_per.siliao,"该好友离线无法聊天")==0)
{
printf("%s,已退出\n",r_per.siliao);
printf("%d时:%d分:%d秒\n",tm->tm_hour,tm->tm_min,tm->tm_sec);
exit(0);
}
else
{
printf("%s\n",r_per.siliao);
printf("%d时:%d分:%d秒\n",tm->tm_hour,tm->tm_min,tm->tm_sec);
}
}
if(r_per.type=='5')//群聊
{
printf("%s\n",r_per.w_buf);
printf("%d时:%d分:%d秒\n",tm->tm_hour,tm->tm_min,tm->tm_sec);
memset(r_per.w_buf,0,sizeof(r_per.w_buf));
}
if(r_per.type=='g')//管理员模式
{
if(strcmp(r_per.zhanghao,"账号或密码错误")==0||strcmp(r_per.passwd,"账号或密码错误")==0)
{
printf("账号密码有误\n");
exit(0);
//print1();
}
else if(strcmp(r_per.w_buf,"账号已在线,请勿重复登陆")==0)
{
printf("%s,已退出\n",r_per.w_buf);
printf("%d时:%d分:%d秒\n",tm->tm_hour,tm->tm_min,tm->tm_sec);
exit(0);
}
else
{
printf("%s\n",r_per.passwd);
print3();
}
}
if(r_per.type=='t')//群聊
{
printf("%s\n",r_per.zhanghao);
printf("%d时:%d分:%d秒\n",tm->tm_hour,tm->tm_min,tm->tm_sec);
}
}
}
void *W_FUN(void *p)
{
while(1)//一级目录循环
{
print1();
memset(&per.type,0,sizeof(per.type));
printf("请输入你的选择:\n");
printf("输入0退出\n");
char shuru[20];//避免先开始客户输入一位数以上的数字
scanf("%s",shuru);
int a=strlen(shuru);
if(a!=1)
{
printf("输入有误\n");
close(fd);
exit(0);
}
per.type=shuru[0];
getchar();
if(per.type=='0')
{
close(fd);
exit(0);
}
switch(per.type)
{
case 'g':
memset(per.zhanghao,0,sizeof(per.zhanghao));
printf("请输入账号\n");
scanf("%s",per.zhanghao);
getchar();
memset(per.passwd,0,sizeof(per.passwd));
printf("请输入密码\n");
scanf("%s",per.passwd);
getchar();
write(fd,&per,sizeof(per));
memset(&per.type,0,sizeof(per.type));
sleep(1);
Cmd();
break;//管理员模式
case '1':Register();sleep(1);break;//注册
case '2':Log_on();sleep(1);break;
case '3':Log_off();break;//注销
}
}
}
int Register(void)//注册
{
memset(per.zhanghao,0,sizeof(per.zhanghao));
printf("请输入姓名\n");
scanf("%s",per.name);
getchar();
memset(per.passwd,0,sizeof(per.passwd));
printf("请输入密码\n");
scanf("%s",per.passwd);
getchar();
write(fd,&per,sizeof(per));
}
int Log_on(void)//登陆
{
memset(&per.id,0,sizeof(per.id));
pid_t pid=getpid();
per.id=(int)pid;
memset(per.zhanghao,0,sizeof(per.zhanghao));
printf("请输入账号\n");
scanf("%s",per.zhanghao);
getchar();
memset(per.passwd,0,sizeof(per.passwd));
printf("请输入密码\n");
scanf("%s",per.passwd);
getchar();
write(fd,&per,sizeof(per));
print2();
printf("请输入选择\n");
scanf("%c",&per.type);
getchar();
switch(per.type)
{
case '4':printf("请输入你想要聊天的人的账号()\n");
memset(per.zhanghao,0,sizeof(per.zhanghao));
scanf("%s",per.zhanghao);
getchar();
write(fd,&per,sizeof(per));
siliao();
break;//私聊
case '5':Double();break;//群聊
case '0':memset(&per,0,sizeof(per));write(fd,&per,sizeof(per));printf("退出\n");exit(0);
default :printf("选择有误\n");break;
}
}
void siliao(void)
{
while(1)
{
sleep(0.1);
printf("输入bye退出私聊\n");
memset(per.siliao,0,sizeof(per.siliao));
scanf("%s",per.siliao);
if(strcmp(per.siliao,"bye")==0)
{
memset(per.siliao,0,sizeof(per.siliao));
sprintf(per.siliao,"私聊已结束");
write(fd,&per,sizeof(per));
break;
}
write(fd,&per,sizeof(per));
}
}
int Log_off(void)//注销
{
memset(&per.type,0,sizeof(per.type));
per.type='3';
memset(per.zhanghao,0,sizeof(per.zhanghao));
printf("请输入你要注销的账号\n");
scanf("%s",per.zhanghao);
getchar();
memset(per.passwd,0,sizeof(per.passwd));
printf("请输入密码\n");
scanf("%s",per.passwd);
getchar();
write(fd,&per,sizeof(per));
sleep(1);
}
int Double(void)//群聊
{
while(1)
{
printf("输入bye退出:\n");
memset(per.w_buf,0,sizeof(per.w_buf));
scanf("%s",per.w_buf);
getchar();
per.type='5';
write(fd,&per,sizeof(per));
if(strcmp(per.w_buf,"bye")==0)
{
close(fd);
exit(0);
}
}
}
int Cmd(void)//管理员模式
{
while(1)
{
print3();
printf("请输入你的选择:");
memset(&per.type,0,sizeof(per.type));
scanf("%c",&per.type);
switch(per.type)
{
case 't':chat_out();break;
//case 'j':break;
//case 'J':break;
//case 'J':break;
case '0':printf("退出\n");exit(0);break;
}
}
}