• 正文
  • 相關推薦
申請入駐 產業(yè)圖譜

從0實現(xiàn)基于Linux socket聊天室-增加數據加密功能-6

02/06 15:17
316
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

之前更新過從0實現(xiàn)聊天室的5篇文章,但是數據在網絡中是裸奔狀態(tài),全部是明文,本文一口君繼續(xù)在原有代碼基礎上增加數據加密功能。

前面文章鏈接:

《從0實現(xiàn)基于Linux socket聊天室-多線程服務器模型-1》?

《從0實現(xiàn)基于Linux socket聊天室-多線程服務器一個很隱晦的錯誤-2》?

《從0實現(xiàn)基于Linux socket聊天室-實現(xiàn)聊天室的登錄、注冊功能-3》?

《從0實現(xiàn)基于Linux socket聊天室-增加公聊、私聊-4》

《從0實現(xiàn)基于Linux socket聊天室-增加數據庫sqlite功能-5》

本文需要增加數據庫功能,關于數據庫的基礎知識點,表的創(chuàng)建、增刪改查等操作,以及對應的庫函數的使用請參考以下3篇文章:

《嵌入式數據庫sqlite3【基礎篇】-基本命令操作,小白一看就懂》

《嵌入式數據庫sqlite3【進階篇】-子句和函數的使用,小白一文入門》

好了讓我們開始吧。

一. 調整目錄結構

為了方便編譯,現(xiàn)在我們將前面文章的代碼結構做如下調整。

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是所有客戶端和服務器都會用到的頭文件,所以放置在根目錄下。

后續(xù)增加功能后,新增的頭文件和C文件分別添加到對應工程目錄的include和src目錄下即可。

二、模塊設計

1. 設計數據庫表

我們之前維護的所有客戶端的信息是用一個全局數組,并且沒有保存功能,現(xiàn)在我們要把所有客戶端的信息全部保存到數據庫中。

數據庫存儲的目錄

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. 下發(fā)keygen流程

3. 客戶端發(fā)送數據

4. 客戶端接收數據

三、 主要功能操作的語句及函數

數據庫操作最重要的就是語句,下面講解針對不同的功能對應的實現(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 增加一個用戶

客戶端發(fā)送注冊請求后,服務器端注冊用戶信息到數據庫中

數據庫操作語句如下:

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

功能函數如下:

int?db_add_user(char?name[],char?passwd[])
功能:
增加一個用戶,執(zhí)行該函數前需要先判斷該用戶名是否存在

參數:
name:用戶名
passwd:密碼

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

3 判斷用戶是否在線

客戶端發(fā)送登陸命令后,服務器通過該函數判斷該用戶是否已經登陸成功

數據庫操作語句如下:

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

功能函數如下:

int?db_user_if_online(char?*name,char?*passwd)
功能:
判斷用戶是否在線,該函數主要根據fd的值來判斷用戶是否在線

參數:
name:用戶名
passwd:密碼??

返回值:
1:在線
-1:不在線
-2:用戶不存在

4 判斷某個用戶名是否注冊

用戶發(fā)送注冊命令,服務器需要判斷該用戶名是否已經被注冊過

數據庫操作語句如下:

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

功能函數如下:

int?db_user_if_reg(char?*name)
功能:
判斷某個用戶名是否注冊過

參數:
name:用戶名

返回值:
?1:注冊過
-1:沒有注冊過

5 判斷用戶名密碼是否正確

用戶發(fā)送登陸命令,需要判斷用戶名密碼是否正確

數據庫操作語句如下:

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

功能函數如下:

int?db_user_pwd_corrct(char?*name,char*?passwd)
功能:
判斷客戶端發(fā)送的用戶名密碼是否正確

參數:
name:用戶名
passwd:密碼

返回值:
?1:正確
-1:用戶名或者密碼不正確

6 用戶上線、下線

用戶登陸成功后,或者發(fā)送下線申請,或者異常掉線,需要更新數據庫的狀態(tài)。

數據庫操作語句如下:

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?<peng@ubuntu.(none)>
Date:???Sun?Nov?7?05:41:58?2021?-0800

??????? 1.服務器端增加數據庫操作功能,數據庫名稱:user.db 用戶表:user
????????2.基于數據庫操作的注冊、登錄、上線、下線功能已經測試通過
????????3.增加clean功能的腳本clean.sh
????????????????????????學習Linux嵌入式請關注公眾號:一口Linux

commit?597330ae0a183c9db8f68b7c9f60df94f8965778
Author:?root?<root@ubuntu.(none)>
Date:???Sat?Nov?6?09:15:40?2021?-0700

????????????????這是聊天室的初始版本V0.1
????????????????該版本包含登錄、注冊、公聊、私聊等功能
????????????????請關注公眾號:一口Linux

切換到沒有數據庫的版本,執(zhí)行下面命令即可。

git?reset?--hard??597330ae0a183c9db8f68b7c9f60df94f8965778

要切回有數據庫的版本執(zhí)行下面的命令:

git?reset?--hard?478e60fc788ff9ffedf890f164e7a61a9a650d14

獲得完整代碼,直接訪問https://gitee.com/wx_98fa5ee790/chat

相關推薦

登錄即可解鎖
  • 海量技術文章
  • 設計資源下載
  • 產業(yè)鏈客戶資源
  • 寫文章/發(fā)需求
立即登錄

公眾號『一口Linux』號主彭老師,擁有15年嵌入式開發(fā)經驗和培訓經驗。曾任職ZTE,某研究所,華清遠見教學總監(jiān)。擁有多篇網絡協(xié)議相關專利和軟件著作。精通計算機網絡、Linux系統(tǒng)編程、ARM、Linux驅動、龍芯、物聯(lián)網。原創(chuàng)內容基本從實際項目出發(fā),保持原理+實踐風格,適合Linux驅動新手入門和技術進階。