1、添加会员制度
会员包含的特权
1、可以禁言用户
2、可踢出用户下线
3、可以防止禁言
4、可以防止被踢
1、服务器代码部分
//踢出下线
void kick(int cmd,long client_socket)
{
//客户端--->服务器
struct _kick
{
char name[SIZE];
}Kick;
read(client_socket,&Kick,sizeof(struct _kick));
//打开在线数据库
sqlite3 *db;
int ret = sqlite3_open("online.db",&db);
if (ret != SQLITE_OK)
{
printf ("数据库打开失败\n");
}
//进行查找
char *errmsg;
const char *sql = "select * from online";
char **value = NULL;
int row;
int column;
ret = sqlite3_get_table(db, sql, &value, &row, &column, &errmsg);
if (ret != SQLITE_OK)
{
printf ("查询失败: %s\n", errmsg);
sqlite3_free(errmsg);
return;
}
int i;
int leave = EXIT;
for (i = column; i < (row*column+column); i+=column)
{
printf("%s\n",value[i]);
printf("%s\n",Kick.name);
if(0 == strcmp(value[i],Kick.name) && 0 == value[i+2]) //找到对方
{
char buf[100];
sprintf(buf ,"delete from online where name = '%s'",Kick.name);
ret = sqlite3_exec(db, buf, NULL, NULL, &errmsg);
if(ret != SQLITE_OK)
{
printf ("%s\n",errmsg);
sqlite3_free(errmsg);
}
count--;
printf("%s下线\n",Kick.name);
write(atol(value[i+1]),&leave,sizeof(int));
break;
}
else
{
printf("%s是会员,防踢\n",Kick.name);
cmd = NOKICK;
break;
}
}
write(client_socket,&cmd,sizeof(int));
sqlite3_close( db );
}
//禁言
void ban(int cmd,long client_socket)
{
//客户端--->服务器
struct _ban
{
char name[SIZE];
int time;
}Ban;
struct _myban
{
int cmd;
int time;
}Myban = {MYBAN};
read(client_socket,&Ban,sizeof(struct _ban));
time1 = Ban.time; //被禁时间
strcpy(name,Ban.name); //被禁言的人
//打开在线数据库
sqlite3 *db;
int ret = sqlite3_open("online.db",&db);
if (ret != SQLITE_OK)
{
printf ("数据库打开失败\n");
}
sqlite3 *db1;
ret = sqlite3_open("mydata.db",&db1);
if (ret != SQLITE_OK)
{
printf ("数据库打开失败\n");
}
//打开信息数据库
//进行查找
char *errmsg;
const char *sql = "select * from online";
char **value = NULL;
int row;
int column;
ret = sqlite3_get_table(db, sql, &value, &row, &column, &errmsg);
if (ret != SQLITE_OK)
{
printf ("查询失败: %s\n", errmsg);
sqlite3_free(errmsg);
return;
}
int i;
for (i = column; i < (row*column+column); i+=column)
{
printf("%s\n",value[i]);
printf("%d\n",atoi(value[i+2]));
if(0 == strcmp(value[i],Ban.name) && 0 == atoi(value[i+2])) //找到对方并且是普通用户
{
char buf[100];
sprintf(buf,"update online set ban = %d where Name = '%s';",1,Ban.name);
ret = sqlite3_exec(db, buf, NULL, NULL, &errmsg );
if(ret != SQLITE_OK)
{
printf ("%s\n",errmsg);
sqlite3_free(errmsg);
}
sprintf(buf,"update mydata set ban = %d where Name = '%s';",1,Ban.name);
ret = sqlite3_exec(db1, buf, NULL, NULL, &errmsg );
if(ret != SQLITE_OK)
{
printf ("%s\n",errmsg);
sqlite3_free(errmsg);
}
write(atol(value[i+1]),&Myban,sizeof(struct _myban));
long socket = atol(value[i+1]);
pthread_t thread;
pthread_create(&thread,NULL,Time,(void *)socket);
pthread_detach(thread);
Myban.cmd = BAN;
printf("%s被禁言%d分钟\n",Ban.name,time1);
break;
}
else if(0 == strcmp(value[i],Ban.name) && 1 == atoi(value[i+2]))
{
Myban.cmd = NOBAN;
printf("%s是会员,免禁言\n",Ban.name);
break;
}
}
write(client_socket,&Myban,sizeof(struct _myban));
sqlite3_close( db );
sqlite3_close( db1 );
}
//禁言延时
void *Time(void *v)
{
2、客户端部分代码
//踢出
void kick(int conn_socket)
{
//客户--->服务器
struct _kick
{
int cmd;
char name[SIZE];
}Kick = {KICK};
//num(conn_socket);
printf("请输入要踢出的账号: ");
scanf("%s",Kick.name);
write(conn_socket,&Kick,sizeof(struct _kick));
}
//禁言
void ban(int conn_socket)
{
read部分
case KICK:
printf("踢出成功\n");
break;
case BAN:
printf("禁言成功\n");
break;
case MYBAN:
ret = read(conn_socket,&Myban,sizeof(struct _myban));
printf("被禁言%d分钟\n",Myban.time);
speak = 1;
break;
case NOBAN:
printf("该用户是会员,无法禁言\n");
break;
case NOKICK:
printf("该用户是会员,无法踢出\n");
break;
case FREE:
speak = 0;
printf("解除禁言\n");
break;