#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <pthread.h>
#include <sqlite3.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/types.h>
typedef struct Data
{
int work; //cli工作指令
int flag; //回执flag
char mess[1024]; //消息
char account[30]; //用户登入账号
char name[30]; //用户昵称
char pass[30]; //用户密码
char online[30]; //在线情况
char time[30];
int root; //root权限?
int jinyan; //禁言flag?
char toName[30];
char fromName[30];
char fileName[30];
char question[256]; //密保问题
char answer[256]; //密保答案
}MsgData;
typedef struct Mylink //聊用聊表
{
char name[30];
int copyClientSocket; //拷贝的cli套接字
int isInChat; //在群聊否 1在0不在,是on chat??
int state; //主动状态,融合私聊
/*
所有int融合成一个state
0;正常状态
1;请勿打扰(禁止私聊)
*/
struct Mylink *next;
}MyLink;
char IP[15];
short PORT;
MyLink *pH;//在线链表
sqlite3 *db = NULL;//数据库
char *errmsg = NULL;//错误集
char **result = NULL;//查询结果
void createTable();//建表
void registerNewAccount(int clientSocket,MsgData *msg);//注册
void* serviceThread(void* _clientSocket);
void offLink(int ClientSocket,MsgData *msg);
MyLink * initLink();
int ifIpError(char *ip);
void enterAccount(int clientSocket,MsgData *msg);
int displayAccount();
int checkPassword(int clientSocket,MsgData *msg);
int checkOnlineAccount(MsgData *msg);
void chatAll(int clientSocket,MsgData *msg);
void chatOne(int clientSocket,MsgData *msg);
void getTheManState(int clientSocket,MsgData *msg);
void linkDeleteNode(int clientSocket,MsgData *msg);
int linkInsertOnlinePeople(int clientSocket,MsgData *msg);
int initSocket();
int myAccept(int serverSocket);
void linkDisplayInchatPeople();
void lookPeopleInChat(int clientSocket,MsgData *msg);
void isRoot(int clientSocket,MsgData *msg);
void makeSlient(int clientSocket,MsgData *msg);
void releaseSlient(int clientSocket,MsgData *msg);
void updatePassword(int clientSocket,MsgData *msg);
void updateName(int clientSocket,MsgData *msg);
void sendFile(int clientSocket,MsgData *msg);
void linkOffline(int clientSocket);
void setRoot(int clientSocket,MsgData *msg);
void removeRoot(int clientSocket,MsgData *msg);
void findTheManAndGetQuestion(int clientSocket,MsgData *msg);
void retrieveAccountPassword(int clientSocket,MsgData *msg);
void getOut(int clientSocket,MsgData *msg);
void informOutPeople(MsgData *msg);
void* serviceThread(void* _clientSocket);
void lookSlientPeople(int clientSocket,MsgData *msg);
void* serviceThread(void* _clientSocket)
{
int clientSocket = (int)_clientSocket;
MsgData msg;
printf("pthread = %d\n",clientSocket);
while(1)
{
if (recv(clientSocket,&msg,sizeof(MsgData),0) <= 0)
{
printf("%d已退出%s\n",clientSocket,msg.name);
linkDeleteNode(clientSocket,&msg); //此处应该写删除节点操作而不是置是否在聊天室中为0不在
//通知群聊里用户此人下线
break;
}
switch(msg.work)
{
case 1:registerNewAccount(clientSocket,&msg);break; //注册插入数据库1
case 2:enterAccount(clientSocket,&msg);break; //登入验证2
case 3:chatAll(clientSocket,&msg);break; //进入群聊3
case 4:getTheManState(clientSocket,&msg);break; //检验对象的状态,在线或者是否接受私聊
case 5:chatOne(clientSocket,&msg);break; //进入私聊5
case 6:lookPeopleInChat(clientSocket,&msg);break; //查看在线用户
case 7:isRoot(clientSocket,&msg);break; //禁言权限判断
case 8:makeSlient(clientSocket,&msg);break; //禁言实际操作
case 10:releaseSlient(clientSocket,&msg);break; //解除禁言实际操作
case 11:updatePassword(clientSocket,&msg);break; //修改密码
case 12:updateName(clientSocket,&msg);break; //修改昵称
case 13:sendFile(clientSocket,&msg);break; //文件传输
case 15:linkOffline(clientSocket);break; //下线
case 16:send(clientSocket,&msg,sizeof(MsgData),0);break;//返回主程序
case 17:setRoot(clientSocket,&msg);break; //设置管理员
case 18:removeRoot(clientSocket,&msg);break; //移除管理
case 19:findTheManAndGetQuestion(clientSocket,&msg);break; //检验昵称
case 20:retrieveAccountPassword(clientSocket,&msg);break; //找回账号和密码
case 21:getOut(clientSocket,&msg);break; //踢人下线
case 22:lookSlientPeople(clientSocket,&msg);break;//查看被禁言人员
}
}
close(clientSocket);
}
void lookSlientPeople(int clientSocket,MsgData *msg)
{
char buf[200];
int nrow = 0;
int ncol = 0;
int rc = sqlite3_open("test.db", &db);
if(rc)
{
printf("can't open db!\n");
msg->flag = -1;
send(clientSocket,msg,sizeof(MsgData),0);
return;
}
sprintf(buf,"select name from info where slient = '%d'",1);//根据账号将昵称找出来
if(SQLITE_OK != sqlite3_get_table(db, buf, &result, &nrow, &ncol, &errmsg))
{
printf("view error\n");
sqlite3_close(db);
return;
}
if(ncol == 0)
{
msg->work = 23;
send(clientSocket,msg,sizeof(MsgData),0);
return;
}
int i = 0;
int j = 0;
for(i = ncol; i < (nrow + 1) * ncol; i++)
{
msg->work = 22;
strcpy(msg->name, result[i]);
printf("name = %s\n",msg->name);
send(clientSocket,msg,sizeof(MsgData),0);
}
sqlite3_free_table(result);
}
void createTable()
{
printf("createTable\n");
char *sql = "create table if not exists info(id integer primary key,account text,name text,password text,root text,slient text,question text,answer text);";
printf("sql = %s\n",sql);
if(SQLITE_OK != sqlite3_exec(db, sql, NULL, NULL, &errmsg))//判断是否成功成功返回SQLITE_OK
{
printf("失败原因:%s\n",errmsg);
printf("\n");
exit(-1);
}
}
//注册插入数据库
void registerNewAccount(int clientSocket, MsgData *msg)
{
char buf[200];
int nrow = 0; //行
int ncol = 0; //列
char tempName[30];
int i = 0;
int j = 0;
int rc = sqlite3_open("test.db", &db);
if(rc)
{
printf("can't open data!\n");
exit(-1);
}
else
{
printf("open data success!\n");
}
createTable();
//检查昵称重复注册
sprintf(buf,"select name from info where name = '%s'",msg->name);
if(SQLITE_OK != sqlite3_get_table(db, buf, &result, &nrow, &ncol, &errmsg))
{
printf("view error%s\n",errmsg);
return;
}
memset(buf,0,sizeof(buf)); //用完就初始化吧
//遇到的一个难点,因为result的机制,单个查的结果在最后面整个查询时平铺显示的1-ncol-1是字段从第ncol开始是查询结果
//for(i = 0; i < (nrow + 1)*ncol; i++)//检验
//{
// j = i;//没有查到i == j
//}
//printf("i = %d\n",i);
//printf("j = %d\n",j);
//printf("(nrow + 1)*ncol = %d\n",(nrow + 1)*ncol);
if(ncol == 0)//没查到结果表示无此账号,可以注册
{
sqlite3_free_table(result);
sprintf(buf, "insert into info(account,name,password,root,slient,question,answer) values ('%s','%s','%s','%d','%d','%s','%s');", msg->account,msg->name,msg->pass,msg->root,0,msg->question,msg->answer);
int ret = sqlite3_exec(db, buf, NULL, NULL, &errmsg);
if (ret != SQLITE_OK)
{
printf("错误原因%s\n",errmsg);
msg->flag = 0;
}
else
{
msg->flag = 1;//成功
displayAccount(); //终端打印校验,一般注释掉
}
}
else
{
printf("ncol = %d\n",ncol);
printf("result[ncol] = %s\n",result[ncol]);
strcpy(tempName,result[ncol]);
sqlite3_free_table(result);
if(strcmp(result[ncol],msg->name) == 0)
{
msg->flag = 3;//重名了
}
}
send(clientSocket,msg,size


YG亲测源码屋
- 粉丝: 469
最新资源
- web专业课程设计方案报告.doc
- 电信运营商通信网络架构培训.ppt
- 区块链技术PPT学习课件.ppt
- 毕业论文校园网络综合项目工程专项方案王静网页设计专业.doc
- 计算机组成课后答案(1).doc
- 精选-《计算机应用基础》习题及答案.doc
- PLC实训综合报告.doc
- 自动生产线升降机的自动化设计(1).doc
- 机器学习中的特征选择.ppt
- 电子商务公司仓储物流手册.doc
- 农远工程对基础教育信息化影响分析等(1).docx
- 高中物理教学中合作学习信息化方法的有效应用(1).docx
- 电子档案利用与纸质档案利用的需求比较探讨的论文-计算机理论论文(1).docx
- 互联网共享数字红利的演讲稿.doc
- iNode客户端安装说明.doc
- 网络系统集成优秀课程设计优质报告.doc
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈



- 1
- 2
- 3
前往页