没有合适的资源?快使用搜索试试~ 我知道了~
其实这个项目在我电脑已经躺了多时,初写完项目规划后,我认认真真地去实现了它,后来拿着这个项目区参加了面试,同样面试官也拿这个项目来问我,当然我是做过一遍了,而且为了面试,我将什么strcpy,strlen等常用的函数都自己实现了一遍,说着,我感觉自己有点挺用功的样子呢! 后来,工作也定下来了,等三方,然后继续帮助我的导师做项目,经过老师的威逼利诱下,我屈服了,又把智能家居系统作为项目,同时也是我的毕业设计,而且功能还要十分完善的说,好吧,别人的简单,但我也无所谓,因为看到技术二字,我必然是两眼放光的那种,特别喜欢那种突然我想到咋么解决了,然后帮功能实现了那种感觉,像是上瘾了一样,(果然是
资源推荐
资源详情
资源评论
基于基于Linux的多功能聊天室的多功能聊天室
其实这个项目在我电脑已经躺了多时,初写完项目规划后,我认认真真地去实现了它,后来拿着这个项目区参加了面试,
同样面试官也拿这个项目来问我,当然我是做过一遍了,而且为了面试,我将什么strcpy,strlen等常用的函数都自己实现了
一遍,说着,我感觉自己有点挺用功的样子呢!
后来,工作也定下来了,等三方,然后继续帮助我的导师做项目,经过老师的威逼利诱下,我屈服了,又把智能家居系统
作为项目,同时也是我的毕业设计,而且功能还要十分完善的说,好吧,别人的简单,但我也无所谓,因为看到技术二字,我
必然是两眼放光的那种,特别喜欢那种突然我想到咋么解决了,然后帮功能实现了那种感觉,像是上瘾了一样,(果然是当程
序员的料)
项目回想与思考
嗯,我的项目基本上的功能和项目规划里面基本上是一致的,而且功能也是非常完善了,基本上能够实现了我所需要的功
能,但是我也要思考我在整个项目过程中的得失,我在项目的思考中,其实把他定义错了,因为是一个非常小的聊天室的功
能,其实我无需使用数据库来作为登陆与否的查询方法,其实完全可以使用链表的方法来做客户端的登录,这样才是不会造成
资源的浪费
项目代码
我将分两篇来讲述我的项目,第一篇(也是这篇为服务器篇);第二篇为客户端篇,当然里面的代码基本上全是我个人所
写,也参考过一部分别的代码!
Makefile
基本上我也忘得差不多了,对这个项目,我感觉淡淡的陌生感,但是重拾还是非常容易的嘛!看一个项目咋么形
成,Makefile不容错过!
main=insert.o chatroom.o sql.o passwd.o string.o cmd.o socket.o
chatroom:$(main)
@gcc$(main)-o chatroom-lsqlite3
passwd.o:passwd.c
@gcc passwd.c-c
insert.o:insert.c
@gcc insert.c-c
sql.o:sql.c
@gcc sql.c-c
string.o:string.c
@gcc string.c-c
cmd.o:cmd.c
@gcc cmd.c-c
socket.o:socket.c
@gcc socket.c-c
.PHONY:clean cleanall
clean:
@rm*.o
cleanall:
@rm*.o chatroom
通过这个我们不难发现这个项目调动了什么,和哪些文件!
passwd.c文件分析
先不说我们把代码贴出来先!
#include"data.h"
void reg_db(sqlite3*db,char**errmsg,char*name,char*passwd)//注册插入
{
char sql[1024];
int rc;
sprintf(sql,"insert into user(name,passwd)values('%s','%s')",name,passwd);
rc=sqlite3_exec(db,sql,NULL,NULL,errmsg);
is_sqlite(rc);
}
void log_db(sqlite3*db,char**errmsg,char*name,int sockfd)//登陆插入
{
char sql[1024];
int rc;
sprintf(sql,"insert into online(name,socket,flag)values('%s',%d,1)",name,sockfd);
rc=sqlite3_exec(db,sql,NULL,NULL,errmsg);
is_sqlite(rc);
}
void delete_online_db(sqlite3*db,char**errmsg,int sockfd)//删除登陆
{
char sql[1024];
int rc;
sprintf(sql,"delete from online where socket=%d",sockfd);
rc=sqlite3_exec(db,sql,NULL,NULL,errmsg);
is_sqlite(rc);
}
int read_user(sqlite3*db,char**errmsg,char*user)//询问有无此用户
{
int rc;
int i;
sqlite3_stmt*stmt=NULL;
rc=sqlite3_prepare(db,"select*from user",-1,&stmt,0);
is_sqlite_ok(rc);
rc=sqlite3_step(stmt);
int userflag=1;
while(rc==SQLITE_ROW)
{
userflag=my_strcmp(user,sqlite3_column_text(stmt,1));
if(userflag==0)
{
return USERIN;
}
rc=sqlite3_step(stmt);
}
return USEROUT;
}
int read_id(sqlite3*db,char**errmsg,char*user)//询问有无此用户
{
int rc;
int i;
sqlite3_stmt*stmt=NULL;
rc=sqlite3_prepare(db,"select*from user",-1,&stmt,0);
is_sqlite_ok(rc);
rc=sqlite3_step(stmt);
int userflag=1;
while(rc==SQLITE_ROW)
{
userflag=my_strcmp(user,sqlite3_column_text(stmt,1));
if(userflag==0)
{
return atoi(sqlite3_column_text(stmt,0));
}
rc=sqlite3_step(stmt);
}
return USEROUT;
}
void read_id_name(sqlite3*db,char**errmsg,vpChat temp)//询问有无此用户
{
int rc;
int i;
sqlite3_stmt*stmt=NULL;
rc=sqlite3_prepare(db,"select*from user",-1,&stmt,0);
is_sqlite_ok(rc);
rc=sqlite3_step(stmt);
int userflag=1;
while(rc==SQLITE_ROW)
{
userflag=my_atoi(sqlite3_column_text(stmt,0));
if(userflag==temp->flag)
{
my_strcpy(temp->name,sqlite3_column_text(stmt,1));
}
rc=sqlite3_step(stmt);
}
}
int read_pass(sqlite3*db,char**errmsg,char*user,char*passwd)//用于用户验证
{
int rc;
int i;
sqlite3_stmt*stmt=NULL;
rc=sqlite3_prepare(db,"select*from user",-1,&stmt,0);
is_sqlite_ok(rc);
rc=sqlite3_step(stmt);
int userflag=1;
int passwdflag=1;
while(rc==SQLITE_ROW)
{
userflag=my_strcmp(user,sqlite3_column_text(stmt,1));
passwdflag=my_strcmp(passwd,sqlite3_column_text(stmt,2));
if(userflag==0&&passwdflag==0)
{
return PASSWDOK;
}
rc=sqlite3_step(stmt);
}
return PASSWDNO;
}
int read_online_ok(sqlite3*db,char**errmsg,char*user)//用于验证在线用户
{
int rc;
int i;
sqlite3_stmt*stmt=NULL;
rc=sqlite3_prepare(db,"select*from online",-1,&stmt,0);
is_sqlite_ok(rc);
rc=sqlite3_step(stmt);
int userflag=1;
while(rc==SQLITE_ROW)
{
userflag=my_strcmp(user,sqlite3_column_text(stmt,1));
if(userflag==0)
{
return ONLINEIN;
}
rc=sqlite3_step(stmt);
}
return ONLINEOUT;
}
哦,这个原来是用来登录注册用的呀!
那么我在来看看passwd.h呢!
void reg_db(sqlite3*db,char**errmsg,char*name,char*passwd);
int read_user(sqlite3*db,char**errmsg,char*user);
int read_pass(sqlite3*db,char**errmsg,char*user,char*passwd);//用于用户验证
int read_online_ok(sqlite3*db,char**errmsg,char*user);
void delete_online_db(sqlite3*db,char**errmsg,int sockfd);
int read_id(sqlite3*db,char**errmsg,char*user);//询问有无此用户
void read_id_name(sqlite3*db,char**errmsg,vpChat temp);//询问有无此用户
原来是对函数进行申明啊!
但是#include”data.h”这个文件又是干什么的呢?
那么data.h按照猜测肯定是各类头文件的引用喽!
#ifndef__DATA__
#define__DATA__
#define MAXSIZE 100
#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<string.h>
#include<netdb.h>
#include<netinet/in.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<ctype.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<sqlite3.h>
#include<unistd.h>
#include<signal.h>
#include<time.h>
#include<termios.h>
#include<assert.h>
#define portnumber 8000//宏定义端口号
剩余18页未读,继续阅读
资源评论
weixin_38686041
- 粉丝: 2
- 资源: 953
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功