聊天室添加新功能

该博客介绍了如何为聊天室添加会员制度,会员享有禁言用户、踢出用户、防止禁言和防止被踢等特权。文章详细讲解了服务器代码和客户端代码的实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值