利用C/S模型实现简单聊天室

    上次我们谈到实现简单聊天室的程序,其实大概流程在上一篇博客已经有讲清楚了,接下来就是贴代码的事情了。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <pthread.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <errno.h>
#include <netinet/in.h>
#include <mysql.h>
#include "myQQ.h"
#define SERV_PORT				5678		//服务器端端口


MYSQL mysql;

//处理发送群聊消息请求
void Send_gmessage(request buf,b_data *back_data)
{
	MYSQL_RES	*res = NULL;
	MYSQL_ROW	rows;
	int rc,i,fields;
	char query_str[200];
	int row;
	memset(query_str,0,strlen(query_str));
	sprintf(query_str,"select * from relationinfo where name2='%s'",buf.recv_user);	//找到此群聊中所有成员,规定关系信息表中群聊在字段2
	
	rc = mysql_real_query(&mysql,query_str,strlen(query_str));
	res = mysql_store_result(&mysql);
	fields = mysql_num_fields(res);
	row = mysql_num_rows(res);
	char ptr[row][20];
	for(i = 0;i < row;i++) {
		rows = mysql_fetch_row(res);
		memset(ptr[i],0,20);
		strcpy(ptr[i],rows[0]);
	}
		
	

	//对每个除了自己以外的成员发送消息
	for(i = 0;i < row;i++) {
		if(strcmp(ptr[i],buf.send_user)) {
			memset(query_str,0,strlen(query_str));
			sprintf(query_str,"select * from userinfo where name='%s'",ptr[i]);
			rc = mysql_real_query(&mysql,query_str,strlen(query_str));

			//判断对方是否离线
			res = mysql_store_result(&mysql);
			fields = mysql_num_fields(res);
			rows = mysql_fetch_row(res);

			if(rows[3][0] - '0' == 0) {
				back_data->cnt = 1;
				break;
			}
			
			int	recv_fd = rows[2][0] - '0';
		
			//将消息写入群聊天记录表中
			memset(query_str,0,strlen(query_str));
			sprintf(query_str,"insert into recordinfo(send_user,recv_user,type,data) values('%s','%s',%d,'%s')",buf.send_user,buf.recv_user,42,buf.data);
			rc = mysql_real_query(&mysql,query_str,strlen(query_str));

			//接收方存在且在线
			back_data->cnt = 1;
			b_data auf;
			memset(&auf,0,sizeof(auf));
			auf.type = 42;

			strcpy(auf.ar[0].send_user,buf.send_user);
			strcpy(auf.ar[0].recv_user,buf.recv_user);
			auf.ar[0].type = 2;
			strcpy(auf.ar[0].data,buf.data);
			printf("%s------->>>>%s\n",buf.send_user,buf.data);
			send(recv_fd,&auf,sizeof(b_data),0);	//发送消息
		}
	}

}


//处理发送私聊消息请求
void Send_message(request buf,b_data *back_data)
{
	MYSQL_RES	*res = NULL;
	MYSQL_ROW	rows;
	int rc,i,fields;
	char query_str[200];
	int recv_fd;
	memset(query_str,0,strlen(query_str));
	sprintf(query_str,"select * from userinfo where name='%s'",buf.recv_user);
	rc = mysql_real_query(&mysql,query_str,strlen(query_str));
	
	//判断对方是否离线
	res = mysql_store_result(&mysql);	
	fields = mysql_num_fields(res);
	rows = mysql_fetch_row(res);

	if(rows[3][0] - '0'== 0) {
		back_data->cnt = 1;				//搁置请求,等对方上线再发送
		return;
	}

	recv_fd = atoi(rows[2]);
	printf("recv_fd = %d\n",recv_fd);

	//将消息写入聊天记录表中
	memset(query_str,0,strlen(query_str));
	sprintf(query_str,"insert into recordinfo(send_user,recv_user,type,data) values('%s','%s',%d,'%s')",buf.send_user,buf.recv_user,41,buf.data);
	rc = mysql_real_query(&mysql,query_str,strlen(query_str));

	//接收方存在且在线
	back_data->cnt = 1;
	b_data auf;
	memset(&auf,0,sizeof(b_data));
	auf.type = 41;
	
	strcpy(auf.ar[0].send_user,buf.send_user);
	strcpy(auf.ar[0].recv_user,buf.recv_user);
	auf.ar[0].type = 1;
	strcpy(auf.ar[0].data,buf.data);
	send(recv_fd,&auf,sizeof(b_data),0);//发送消息


}

//处理删除好友请求
void Delete_Friend(request buf,b_data *back_data)
{
	MYSQL_RES	*res = NULL;
	MYSQL_ROW	rows;
	int rc,i,fields;
	int row;
	char query_str[200];					//存放mysql语句
	int recv_fd;
	//判断双方是否为好友
	sprintf(query_str,"select * from relationinfo where name1='%s' and name2='%s'",buf.send_user,buf.recv_user);
	rc = mysql_real_query(&mysql,query_str,strlen(query_str));
	if(rc != 0) {
		back_data->cnt = 0;					//说明双方不是好友了
		puts("1");
		return;	
	}
	printf("%s %s\n",buf.send_user,buf.recv_user);
	
	res = mysql_store_result(&mysql);
	mysql_free_result(res);
	
	
	//从关系信息表中删除双方好友信息
	memset(query_str,0,strlen(query_str));
	sprintf(query_str,"delete from relationinfo where name1='%s' and name2='%s'",buf.send_user,buf.recv_user);
	rc = mysql_real_query(&mysql,query_str,strlen(query_str));
	if(rc != 0) 
		printf("%s\n",mysql_error(&mysql));
	
	res = mysql_store_result(&mysql);

	memset(query_str,0,strlen(query_str));
	sprintf(query_str,"delete from relationinfo where name1='%s' and name2='%s'",buf.recv_user,buf.send_user);
	rc = mysql_real_query(&mysql,query_str,strlen(query_str));
	if(rc != 0) 
		printf("%s\n",mysql_error(&mysql));
	back_data->cnt = 1;

}

//处理创建群聊请求
void Create_Group(request buf,b_data *back_data)
{
	MYSQL_RES	*res = NULL;
	
	int rc,i,fields;
	int rows;
	char query_str[200];
	int recv_fd;
	//判断是否存在此群聊
	memset(query_str,0,strlen(query_str));
	sprintf(query_str,"select * from relationinfo where name2='%s'",buf.data);
	rc = mysql_real_query(&mysql,query_str,strlen(query_str));
	res = mysql_store_result(&mysql);
	rows = mysql_num_rows(res);

	//判断该群聊是否存在
	if(rows != 0) {
		back_data->cnt = 0;
		return;
	}

	//若不存在则创建
	memset(query_str,0,strlen(query_str));
	sprintf(query_str,"insert into relationinfo(name1,name2,power) values('%s','%s',%d)",buf.send_user,buf.data,1);
	rc = mysql_real_query(&mysql,query_str,strlen(query_str));
	if(rc != 0) {
		back_data->cnt = 0;
		return;
	}
	back_data->cnt = 1;

}

//处理添加好友请求
void Add_Friend(request buf,b_data * back_data)
{
	
	MYSQL_RES	*res = NULL;
	MYSQL_ROW	rows;
	int rc,i,fields;
	int row;
	char query_str[200];					//存放mysql语句
	int recv_fd;
	//判断双方是否为好友
	memset(query_str,0,strlen(query_str));
	sprintf(query_str,"select * from relationinfo where name1='%s' and name2='%s'",buf.send_user,buf.recv_user);
	rc = mysql_real_query(&mysql,query_str,strlen(query_str));
	if(rc == 0) {
		back_data->cnt = 0;					//说明双方已经是好友了
		return;	
	}

	//判断对方是否离线
	mysql_store_result(&mysql);
	memset(query_str,0,sizeof(strlen(query_str))
  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值