#include "chat.h"
/*
Email:gfj19900401@163.com
server.c
server 服务器
*/
proto p[]={
{PUBLIC_CHAT, public_chat}, //群聊
{PRIVATE_CHAT, private_chat}, //私聊
{CLIENT_LOGIN, server_check_login}, //登陆验证
{CLIENT_REGISTER, register_new_client}, //注册
{CLIENT_ONLINE, get_all_online_clients},//获取所有的在线用户
{CLIENT_EXIT, client_exit}, //客户退出
{ADMIN_KICK_CLIENT, admin_kick_client}, //管理员踢出某个用户
{ADMIN_SHUTUP_CLIENT, admin_shutup_client},//管理员踢出禁言某个用户
{ADVANCED_CLIENT_TO_ADMIN, advanced_client_to_admin},//管理员提升某用户为管理员
{DROP_CLIENT_TO_NORMAL, drop_client_to_normal}, //管理员把某用户降为普通用户
{0,0}
};
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
static int id=CLIENT_ID; //init client id
int main(int argc ,char *argv[])
{
int socketfd,newfd;
socketfd=system_init();
connect_to_client(socketfd);
return 0;
}
void fun()
{
int i=0;
for(;i<QUEUELEN;i++)
{
if(clients[i].tid!=0)
DEBUG("=========%d\t%d\t%s\t%s\t%d\t%d\t%d\t\n",clients[i].tid,clients[i].sockfd,clients[i].client_name,clients[i].client_passwd,clients[i].client_id,clients[i].is_online,clients[i].admin);
}
}
//管理员提升某用户为管理员
void advanced_client_to_admin (send_info *send,int newfd)
{
if(admin_opt_self (send,newfd)) return;
pthread_mutex_lock(&mutex);
char *tok_file[5];
int file_fd;
char buf[BUF_SIZE]={0};
char all_buf[BUF_SIZE]={0};
char ret_buf[100]={0};
char ret_buf_to_admin[100]={0};
char save_buf[BUF_SIZE]={0};
if((file_fd=open(FILENAME,O_RDWR,0644))==-1)
err("server_check_login open file failed!");
int len=0;
int j=0;
int flag=0;
while(1)
{
lseek(file_fd,len,SEEK_SET);
if(read(file_fd,buf,BUF_SIZE)==0) break;
strcpy(save_buf,buf);
//DEBUG("advanced_client_to_admin strlen(buf)=%d\n ",strlen(buf));
// DEBUG("advanced_client_to_admin buf=%s\n",buf);
len+=strlen(buf)+2;
j=0;
tok_file[j++]=strtok(buf,":");
while(tok_file[j++]=strtok(NULL,":"));
if(strcmp(tok_file[2],send->id)==0)
{
lseek(file_fd,len-strlen(save_buf)-2,SEEK_SET);
sprintf(tok_file[3],"1");//将权限位改为1,并回写到文件中
sprintf(all_buf,"%s:%s:%s:%s",tok_file[0],tok_file[1],tok_file[2],tok_file[3]);
// DEBUG("advanced_client_to_admin strlen(all_buf)=%d\n ",strlen(all_buf));
// DEBUG("advanced_client_to_admin all_buf=%s\n",all_buf);
write(file_fd,all_buf,strlen(all_buf)+1);
write(file_fd,"\n",1);// write a enter write length=2
flag =1;
break;
}
else
flag =0;
memset(buf,0,sizeof(buf));
}
memset(ret_buf,0,sizeof(ret_buf));
// DEBUG("get_sockfd(send->id)=%d\n",get_sockfd(send->id));
if(flag==1)
{
sprintf(ret_buf ,"advanced");
sprintf(ret_buf_to_admin,"您对\tid=%s\t 的用户提升为管理员成功.",send->id);
write(get_sockfd(send->id),ret_buf,strlen(ret_buf)+1);
write(newfd,ret_buf_to_admin,strlen(ret_buf_to_admin)+1);
}
else
{
sprintf(ret_buf ,"没有\tid=%s\t的用户,请您核对后操作.",send->id);
write(newfd,ret_buf,strlen(ret_buf)+1);
}
close(file_fd);
pthread_mutex_unlock(&mutex);
}
//把某个管理员降为普通用户
void drop_client_to_normal (send_info *send,int newfd)
{
if(admin_opt_self (send,newfd)) return;
pthread_mutex_lock(&mutex);
char *tok_file[5];
int file_fd;
char buf[BUF_SIZE]={0};
char all_buf[BUF_SIZE]={0};
char ret_buf[100]={0};
char ret_buf_to_admin[100]={0};
char save_buf[BUF_SIZE]={0};
if((file_fd=open(FILENAME,O_RDWR,0644))==-1)
err("server_check_login open file failed!");
int len=0;
int j=0;
int flag=0;
while(1)
{
lseek(file_fd,len,SEEK_SET);
if(read(file_fd,buf,BUF_SIZE)==0) break;
strcpy(save_buf,buf);
//DEBUG("advanced_client_to_admin strlen(buf)=%d\n ",strlen(buf));
// DEBUG("advanced_client_to_admin buf=%s\n",buf);
len+=strlen(buf)+2;
j=0;
tok_file[j++]=strtok(buf,":");
while(tok_file[j++]=strtok(NULL,":"));
if(strcmp(tok_file[2],send->id)==0)
{
lseek(file_fd,len-strlen(save_buf)-2,SEEK_SET);
sprintf(tok_file[3],"0");//将权限位改为0,并回写到文件中
sprintf(all_buf,"%s:%s:%s:%s",tok_file[0],tok_file[1],tok_file[2],tok_file[3]);
// DEBUG("advanced_client_to_admin strlen(all_buf)=%d\n ",strlen(all_buf));
// DEBUG("advanced_client_to_admin all_buf=%s\n",all_buf);
write(file_fd,all_buf,strlen(all_buf)+1);
write(file_fd,"\n",1);// write a enter write length=2
flag =1;
break;
}
else
flag =0;
memset(buf,0,sizeof(buf));
}
memset(ret_buf,0,sizeof(ret_buf));
// DEBUG("get_sockfd(send->id)=%d\n",get_sockfd(send->id));
if(flag==1)
{
sprintf(ret_buf ,"normal");
sprintf(ret_buf_to_admin,"您对\tid=%s\t 的用户降为为普通用户成功.",send->id);
write(get_sockfd(send->id),ret_buf,strlen(ret_buf)+1);
write(newfd,ret_buf_to_admin,strlen(ret_buf_to_admin)+1);
}
else
{
sprintf(ret_buf ,"没有\tid=%s\t的用户,请您核对后操作.",send->id);
write(newfd,ret_buf,strlen(ret_buf)+1);
}
close(file_fd);
pthread_mutex_unlock(&mutex);
}
//判断是否是对自己进行踢下线,禁言,提升或降低权限
int
admin_is_opt_self(send_info *send,int newfd)
{//DEBUG("admin_is_opt_self %s\n",send->id);
//DEBUG("newfd= %d\n",newfd);
//DEBUG("get_sockfd(send->id)= %d\n",get_sockfd(send->id));
int i=0;
for(;i<QUEUELEN;i++)
{
if(get_sockfd(send->id)==newfd)
{
return 1;
}
}
return 0;
}
//如果是对自己进行踢下线,禁言,提升或降低权限 ,则不作任何操作,并提示用户
int admin_opt_self(send_info *send,int newfd)
{
char self[100]={0};
if(admin_is_opt_self(send,newfd))
{
sprintf (self,"self");
write(newfd,self,strlen(self)+1);
return 1;
}
else return 0;
}
// 踢出某人(强制某人下线)
void admin_kick_client (send_info *send,int newfd)
{//DEBUG("///////////////////%s\n",send->id);
//fun() ;
if(admin_opt_self (send,newfd)) return;
char *p[5];
p[2] =send->id;
// DEBUG("p[2]=%s\n",p[2]);
int kick_client_sockfd=0;
char ret_admin_buf[100]={0};
char ret_kicked_buf[10]="exit";//向被踢的用户发送的信息
if(check_online(p)==0)//if 踢出用户不在线则提示管理员
{//DEBUG("//////0000000///\n");
memset(ret_admin_buf,0,sizeof(ret_admin_buf));
sprintf(ret_admin_buf,"该用户不在线或不存在,请用-online查看所有的在线用户,并确保存在,方能踢出用户.");
write(newfd,ret_admin_buf,strlen(ret_admin_buf)+1);
return;
}
int i=0;
for(;i<QUEUELEN;i++)
{//DEBUG(" atoi(send->id) =%d\n",atoi(send->id));
if(atoi(send->id)==clients[i].client_id)
break;
}
if((kick_client_sockfd=get_sockfd(send->id))!=0)
{
memset(ret_admin_buf,0,sizeof(ret_admin_buf));
sprintf(ret_admin_buf,"kick client name : %s -->> id: %d success.",clients[i].client_name,clients[i].client_id);
write(kick_client_sockfd,ret_kicked_buf,strlen(ret_kicked_buf)+1);
write(newfd,ret_admin_buf,strlen(ret_admin_buf)+1);
}
}
//禁言某个客户,只是禁言不退出,能接受信息,在一段时间中不能发送信息 。
void admin_shutup_client(send_info *send,int newfd)
{
if(admin_opt_self (send,newfd)) return;
char *p[5];
p[2] =send->id;
int shutup_client_sockfd=0;
char ret_admin_buf[100]={0};
char ret_shutup_client_buf[10]="shutup";//向被踢的用户发送的信息
if(check_onli
评论30