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