之前更新過從0實(shí)現(xiàn)聊天室的5篇文章,但是數(shù)據(jù)在網(wǎng)絡(luò)中是裸奔狀態(tài),全部是明文,本文一口君繼續(xù)在原有代碼基礎(chǔ)上增加數(shù)據(jù)加密功能。
前面文章鏈接:
《從0實(shí)現(xiàn)基于Linux socket聊天室-多線程服務(wù)器模型-1》?
《從0實(shí)現(xiàn)基于Linux socket聊天室-多線程服務(wù)器一個(gè)很隱晦的錯(cuò)誤-2》?
《從0實(shí)現(xiàn)基于Linux socket聊天室-實(shí)現(xiàn)聊天室的登錄、注冊功能-3》?
《從0實(shí)現(xiàn)基于Linux socket聊天室-增加公聊、私聊-4》
《從0實(shí)現(xiàn)基于Linux socket聊天室-增加數(shù)據(jù)庫sqlite功能-5》
本文需要增加數(shù)據(jù)庫功能,關(guān)于數(shù)據(jù)庫的基礎(chǔ)知識點(diǎn),表的創(chuàng)建、增刪改查等操作,以及對應(yīng)的庫函數(shù)的使用請參考以下3篇文章:
《嵌入式數(shù)據(jù)庫sqlite3【基礎(chǔ)篇】-基本命令操作,小白一看就懂》
《嵌入式數(shù)據(jù)庫sqlite3【進(jìn)階篇】-子句和函數(shù)的使用,小白一文入門》
好了讓我們開始吧。
一. 調(diào)整目錄結(jié)構(gòu)
為了方便編譯,現(xiàn)在我們將前面文章的代碼結(jié)構(gòu)做如下調(diào)整。
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
服務(wù)端代碼放置到chat_server目錄下;客戶端代碼放置到chat_client目錄下;
數(shù)據(jù)庫相關(guān)代碼放在chat_server/data下。
chat.h是所有客戶端和服務(wù)器都會用到的頭文件,所以放置在根目錄下。
后續(xù)增加功能后,新增的頭文件和C文件分別添加到對應(yīng)工程目錄的include和src目錄下即可。
二、模塊設(shè)計(jì)
1. 設(shè)計(jì)數(shù)據(jù)庫表
我們之前維護(hù)的所有客戶端的信息是用一個(gè)全局?jǐn)?shù)組,并且沒有保存功能,現(xiàn)在我們要把所有客戶端的信息全部保存到數(shù)據(jù)庫中。
數(shù)據(jù)庫存儲的目錄
chat_server/data
數(shù)據(jù)庫名:
user.db
存儲用戶信息的表名:
user
表user格式如下:
名稱 | 屬性 | 說明 |
---|---|---|
name | TEXT PRIMARY KEY | 用戶名,不能重復(fù) |
passwd | TEXT NOT NULL | 密碼 |
fd | INT NOT NULL | 套接字描述符:-1表示不在線,>0表示在線 |
regist | INT NOT NULL | 用戶名是否注冊:-1沒有注冊,1注冊 |
2. 下發(fā)keygen流程
3. 客戶端發(fā)送數(shù)據(jù)
4. 客戶端接收數(shù)據(jù)
三、 主要功能操作的語句及函數(shù)
數(shù)據(jù)庫操作最重要的就是語句,下面講解針對不同的功能對應(yīng)的實(shí)現(xiàn)語句
1 創(chuàng)建表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 增加一個(gè)用戶
客戶端發(fā)送注冊請求后,服務(wù)器端注冊用戶信息到數(shù)據(jù)庫中
數(shù)據(jù)庫操作語句如下:
insert?into?user?values('一口Linux',?'123456',-1,?1)
功能函數(shù)如下:
int?db_add_user(char?name[],char?passwd[])
功能:
增加一個(gè)用戶,執(zhí)行該函數(shù)前需要先判斷該用戶名是否存在
參數(shù):
name:用戶名
passwd:密碼
返回值:
-1:失敗
1:成功
3 判斷用戶是否在線
客戶端發(fā)送登陸命令后,服務(wù)器通過該函數(shù)判斷該用戶是否已經(jīng)登陸成功
數(shù)據(jù)庫操作語句如下:
select?fd?from?user?where?name='一口Linux'
功能函數(shù)如下:
int?db_user_if_online(char?*name,char?*passwd)
功能:
判斷用戶是否在線,該函數(shù)主要根據(jù)fd的值來判斷用戶是否在線
參數(shù):
name:用戶名
passwd:密碼??
返回值:
1:在線
-1:不在線
-2:用戶不存在
4 判斷某個(gè)用戶名是否注冊
用戶發(fā)送注冊命令,服務(wù)器需要判斷該用戶名是否已經(jīng)被注冊過
數(shù)據(jù)庫操作語句如下:
select?regist?from?user?where?name='一口Linux'
功能函數(shù)如下:
int?db_user_if_reg(char?*name)
功能:
判斷某個(gè)用戶名是否注冊過
參數(shù):
name:用戶名
返回值:
?1:注冊過
-1:沒有注冊過
5 判斷用戶名密碼是否正確
用戶發(fā)送登陸命令,需要判斷用戶名密碼是否正確
數(shù)據(jù)庫操作語句如下:
select?*?from?user?where?name='一口Linux'?and?passwd='123456'
功能函數(shù)如下:
int?db_user_pwd_corrct(char?*name,char*?passwd)
功能:
判斷客戶端發(fā)送的用戶名密碼是否正確
參數(shù):
name:用戶名
passwd:密碼
返回值:
?1:正確
-1:用戶名或者密碼不正確
6 用戶上線、下線
用戶登陸成功后,或者發(fā)送下線申請,或者異常掉線,需要更新數(shù)據(jù)庫的狀態(tài)。
數(shù)據(jù)庫操作語句如下:
UPDATE??user?set?fd=-1?where?name='一口Linux'
fd的值是套接字描述符,下線設(shè)置為-1,上線設(shè)置為對應(yīng)的>0的值
功能函數(shù)如下:
int?db_user_on_off(int?fd,char?*name,unsigned?int?on_off)?
功能:
更新數(shù)據(jù)庫中用戶的fd字段
參數(shù):
fd:套接字描述符
name:用戶名
on_off:上線還是下線
返回值:
?1:正確
-1:失敗
四、運(yùn)行結(jié)果
界面與之前操作一致!
可以參考前面系列文章!
下面是操作視頻:
五、代碼說明
本實(shí)例代碼已經(jīng)上傳到gitee倉庫,
地址:https://gitee.com/wx_98fa5ee790/chat
如果代碼對你有所幫助,還請給一口君一個(gè)小心心!
云盤下載的代碼,log如下:
linux@ubuntu:/mnt/hgfs/share/code$?git?log
commit?478e60fc788ff9ffedf890f164e7a61a9a650d14
Author:?peng?<peng@ubuntu.(none)>
Date:???Sun?Nov?7?05:41:58?2021?-0800
??????? 1.服務(wù)器端增加數(shù)據(jù)庫操作功能,數(shù)據(jù)庫名稱:user.db 用戶表:user
????????2.基于數(shù)據(jù)庫操作的注冊、登錄、上線、下線功能已經(jīng)測試通過
????????3.增加clean功能的腳本clean.sh
????????????????????????學(xué)習(xí)Linux嵌入式請關(guān)注公眾號:一口Linux
commit?597330ae0a183c9db8f68b7c9f60df94f8965778
Author:?root?<root@ubuntu.(none)>
Date:???Sat?Nov?6?09:15:40?2021?-0700
????????????????這是聊天室的初始版本V0.1
????????????????該版本包含登錄、注冊、公聊、私聊等功能
????????????????請關(guān)注公眾號:一口Linux
切換到?jīng)]有數(shù)據(jù)庫的版本,執(zhí)行下面命令即可。
git?reset?--hard??597330ae0a183c9db8f68b7c9f60df94f8965778
要切回有數(shù)據(jù)庫的版本執(zhí)行下面的命令:
git?reset?--hard?478e60fc788ff9ffedf890f164e7a61a9a650d14
獲得完整代碼,直接訪問https://gitee.com/wx_98fa5ee790/chat