简易聊天室五 用户登录

来源:互联网 发布:天音淘宝复制大师3.03 编辑:程序博客网 时间:2024/04/29 22:53

简易聊天室五    用户登录

            半个月过去了,断断续续也把聊天室更新到了第五节,前几节,我们搭建了框架,创建了注册数据库,完成了用户的注册。今天,我们来让已经注册的用户完成登录,成为聊天室的一员。

            其实大家仔细想想,用户登录也就是要完成下面几个步骤:

1.采集到用户输入的登录信息。

2.将登录信息发送到server进行验证

3.是否有次id

4.id正确,密码是否正确

5.所有的都正确后,是否存在已登陆

6.登录完成后,将此用户标志为已登陆用户

下面,我们就这几个步骤,逐一用代码实现。

一.采集用户输入的登录信息.

int Log(int clientfd,chat_t *client_struct){//write(clientfd,"Log",3);log:client_struct->action = LOG;//write(clientfd,client_struct,sizeof(chat_t));printf("请输入您的id:\n");scanf("%d",&client_struct->logId);getchar();printf("请输入您的密码:\n");scanf("%s",client_struct->logPassword);write(clientfd,client_struct,sizeof(chat_t));read(clientfd,client_struct,sizeof(chat_t));if(client_struct->ack1 == OK&& client_struct->ack == OK){printf("验证信息正确,登录成功\n");return 0;}else if(client_struct->ack1 == OK && client_struct->ack == NO){printf("该用户已登陆\n");memset(client_struct,0,sizeof(chat_t));goto log;}else if(client_struct->ack == OK && client_struct->ack1 == NO){printf("密码错误,请重新登录\n");memset(client_struct,0,sizeof(chat_t));goto log;}else{printf("id不存在\n");goto log;}}


我们将信息放入client_struct结构体中,发送给server。采集到的返回值分为四种:“该用户已登陆”  “密码错误”  “id不存在”  “验证信息正确,登录成功”。

二.将登录信息发送到server进行验证

客户端通过

write(clientfd,client_struct,sizeof(chat_t));

发送数据包。

server通过

while(1){memset(client_struct,0,sizeof(chat_t));read(client_fd,client_struct,sizeof(chat_t));printf("%s\n%s\n",client_struct->regName,client_struct->regPassword);printf("%d,i=%d,fd=%d\n",client_struct->action,i++,client_fd);switch(client_struct->action){case LOG:Log(client_fd,client_struct);break;case REG:reg(client_fd,client_struct);break;default:sqlite3_close(db);break;}}

接受发送过来的数据包,然后进行解析。

.是否有次id

四.id正确,密码是否正确

五.所有的都正确后,是否存在已登陆

其实这几步骤,都是通过执行数据库callback函数进行查询,查询流程如下

int Log(int client_fd,chat_t *chat_struct){//printf("Log\n");char sql[50] = {0};char *errmsg;sqlite3_exec(db,"select * from client_tb",callback_log,chat_struct,NULL);write(client_fd,chat_struct,sizeof(chat_t));if(chat_struct->ack1 == OK && chat_struct->ack == OK){sprintf(sql,"update client_tb set online=1 where id=%d",chat_struct->logId);sqlite3_exec(db,sql,NULL,NULL,&errmsg);printf("target %s\n",errmsg);}return 0;}


int callback_log(void *arg,int n,char**result,char**name){chat_t *p =  (chat_t*)arg;int i = 0;for(i = 0 ; i < n ; i++){if(strcmp(name[i],"id") == 0  )    //锁定id栏{if(p->logId == atoi(result[i]))   //id相同{p->ack = OK;if(strcmp(p->logPassword,result[i+2])== 0)//密码正确{p->ack1 = OK;sprintf(p->regName,"%s",result[i+1]);if(atoi(result[i+3]) == 1)   //是否已登陆{p->ack  = NO;}}}}}return 0;}


正如程序中备注的,一个callback函数,完成了三个功能。通过ack和ack1配合返回,完成四种排列组合

ack=OKack1 = NO登录成功ack=OKack1 = NO已登陆ack=OKack1 = NO密码错误ack=OKack1 = NOid不存在
.登录完成后,将此用户标志为已登陆用户

使用sqlite更新数据库指令

if(chat_struct->ack1 == OK && chat_struct->ack == OK){sprintf(sql,"update client_tb set online=1 where id=%d",chat_struct->logId);sqlite3_exec(db,sql,NULL,NULL,&errmsg);printf("target %s\n",errmsg);}


就此,登录就完成了,不难把,程序还有很多不足,以后还要加入很多其他的情况考虑。

下面是下载程序的链接

欢迎大家评论

0 0
原创粉丝点击