一口Linux

文章数:1382 被阅读:1966155

账号入驻

从0实现基于Linux socket聊天室-增加数据加密功能-6

最新更新时间:2021-12-20
    阅读数:

击上方“ 一口Linux ”,选择“ 星标公众号


干货福利,第一时间送达!

之前更新过从0实现聊天室的5篇文章,但是数据在网络中是裸奔状态,全部是明文,本文一口君继续在原有代码基础上增加数据加密功能。

前面文章链接:

从0实现基于Linux socket聊天室-多线程服务器模型-1

从0实现基于Linux socket聊天室-多线程服务器一个很隐晦的错误-2

从0实现基于Linux socket聊天室-实现聊天室的登录、注册功能-3

从0实现基于Linux socket聊天室-增加公聊、私聊-4

从0实现基于Linux socket聊天室-增加数据库sqlite功能-5

本文需要增加数据库功能,关于数据库的基础知识点,表的创建、增删改查等操作,以及对应的库函数的使用请参考以下3篇文章:

嵌入式数据库sqlite3【基础篇】-基本命令操作,小白一看就懂

如何用C语言操作sqlite3,一文搞懂

好了让我们开始吧。

一. 调整目录结构

为了方便编译,现在我们将前面文章的代码结构做如下调整。

root@ubuntu:/mnt/hgfs/code/chat# tree .
.
├── chat_client
│   ├── include
│   ├── Makefile
│   ├── obj
│   │   └── Makefile
│   └── src
│       ├── client.c
│       └── Makefile
├── chat.h
├── chat_server
│   ├── bin
│   │   └── server
│   ├── data
│   ├── include
│   ├── Makefile
│   ├── obj
│   │   └── server.o
│   └── src
│       ├── Makefile
│       └── server.c
└── gcc.sh

10 directories, 15 files

服务端代码放置到chat_server目录下;客户端代码放置到chat_client目录下;

数据库相关代码放在chat_server/data下。

chat.h是所有客户端和服务器都会用到的头文件,所以放置在根目录下。

后续增加功能后,新增的头文件和C文件分别添加到对应工程目录的include和src目录下即可。

二、模块设计

1. 设计数据库表

我们之前维护的所有客户端的信息是用一个全局数组,并且没有保存功能,现在我们要把所有客户端的信息全部保存到数据库中。

数据库存储的目录

chat_server/data

数据库名:

user.db

存储用户信息的表名:

user

表user格式如下:

名称 属性 说明
name TEXT PRIMARY KEY 用户名,不能重复
passwd TEXT NOT NULL 密码
fd INT NOT NULL 套接字描述符:-1表示不在线,>0表示在线
regist INT NOT NULL 用户名是否注册:-1没有注册,1注册

2. 下发keygen流程

3. 客户端发送数据

4. 客户端接收数据

三、 主要功能操作的语句及函数

数据库操作最重要的就是语句,下面讲解针对不同的功能对应的实现语句

1 创建表user

CREATE TABLE IF NOT EXISTS user(name TEXT PRIMARY KEY  NOT NULL,passwd TEXT NOT NULL,fd INT NOT NULL,regist INT  NOT NULL);

2 增加一个用户

客户端发送注册请求后,服务器端注册用户信息到数据库中

数据库操作语句如下:

insert into user values('一口Linux''123456',-1, 1)

功能函数如下:

int db_add_user(char name[],char passwd[])
功能:
增加一个用户,执行该函数前需要先判断该用户名是否存在

参数:
name:用户名
passwd:密码

返回值:
-1:失败
1:成功

3 判断用户是否在线

客户端发送登陆命令后,服务器通过该函数判断该用户是否已经登陆成功

数据库操作语句如下:

select fd from user where name='一口Linux'

功能函数如下:

int db_user_if_online(char *name,char *passwd)
功能:
判断用户是否在线,该函数主要根据fd的值来判断用户是否在线

参数:
name:用户名
passwd:密码  

返回值:
1:在线
-1:不在线
-2:用户不存在

4 判断某个用户名是否注册

用户发送注册命令,服务器需要判断该用户名是否已经被注册过

数据库操作语句如下:

select regist from user where name='一口Linux'

功能函数如下:

int db_user_if_reg(char *name)
功能:
判断某个用户名是否注册过

参数:
name:用户名

返回值:
 1:注册过
-1:没有注册过

5 判断用户名密码是否正确

用户发送登陆命令,需要判断用户名密码是否正确

数据库操作语句如下:

select * from user where name='一口Linux' and passwd='123456'

功能函数如下:

int db_user_pwd_corrct(char *name,char* passwd)
功能:
判断客户端发送的用户名密码是否正确

参数:
name:用户名
passwd:密码

返回值:
 1:正确
-1:用户名或者密码不正确

6 用户上线、下线

用户登陆成功后,或者发送下线申请,或者异常掉线,需要更新数据库的状态。

数据库操作语句如下:

UPDATE  user set fd=-1 where name='一口Linux'

fd的值是套接字描述符,下线设置为-1,上线设置为对应的>0的值

功能函数如下:

int db_user_on_off(int fd,char *name,unsigned int on_off) 
功能:
更新数据库中用户的fd字段

参数:
fd:套接字描述符
name:用户名
on_off:上线还是下线

返回值:
 1:正确
-1:失败

四、运行结果

界面与之前操作一致!

可以参考前面系列文章!

下面是操作视频:

五、代码说明

本实例代码已经上传到gitee仓库, 地址:https://gitee.com/wx_98fa5ee790/chat

如果代码对你有所帮助,还请给一口君一个小心心!

云盘下载的代码,log如下:

linux@ubuntu:/mnt/hgfs/share/code$ git log
commit 478e60fc788ff9ffedf890f164e7a61a9a650d14
Author: peng 
Date:   Sun Nov 7 05:41:58 2021 -0800

        1.服务器端增加数据库操作功能,数据库名称:user.db 用户表:user
        2.基于数据库操作的注册、登录、上线、下线功能已经测试通过
        3.增加clean功能的脚本clean.sh
                        学习Linux嵌入式请关注公众号:一口Linux

commit 597330ae0a183c9db8f68b7c9f60df94f8965778
Author: root 
Date:   Sat Nov 6 09:15:40 2021 -0700

                这是聊天室的初始版本V0.1
                该版本包含登录、注册、公聊、私聊等功能
                请关注公众号:一口Linux

切换到没有数据库的版本,执行下面命令即可。

git reset --hard  597330ae0a183c9db8f68b7c9f60df94f8965778

要切回有数据库的版本执行下面的命令:

git reset --hard 478e60fc788ff9ffedf890f164e7a61a9a650d14

获得完整代码, 直接访问https://gitee.com/wx_98fa5ee790/chat

或者关注公众号:一口Linux,后台回复:chat

end



一口Linux


关注,回复【 1024 】海量Linux资料赠送


精彩文章合集

文章推荐

【专辑】 ARM
【专辑】 粉丝问答
【专辑】 所有原创
专辑 linux 入门
专辑 计算机网络
专辑 Linux驱动


点击“ 阅读原文 ”查看更多分享,欢迎 点分享、收藏、点赞、在看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: TI培训

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved