Linux系統c 伺服器軟體系統設計方案分析

2022-07-10 14:15:11 字數 4337 閱讀 8079

1.1 結構設計

採用模組化的設計,伺服器主要由幾個部分構成:半同步/半反應堆執行緒池以及非同步日誌系統。

伺服器維持主線程來通過epoll系統呼叫監聽

socket

連線,被監聽到的

socket

連線會被

accept

。同時主線程會維持乙個監聽佇列。伺服器通過

epoll

系統呼叫來完成對監聽

socket

(listenfd

)和連線

socket

(客戶請求)的同時監聽。通過執行緒池來實現併發,為每個就緒的檔案描述符分配乙個邏輯單元(執行緒)來處理。

伺服器需要處理三類事件:i/o事件,訊號及定時事件。主線程負責讀寫,工作執行緒(執行緒池中的執行緒)負責處理邏輯(

請求報文的解析等)。工作執行緒完成對

報文請求的解析,並按照報文的型別返回不同的結果。在使用者登入時還會查詢資料庫。同時完成對非活動連線的處理以及日誌的輸出。

1.2 系統流程圖

1.3 系統活**

2.1 軟體結構特點

2.1.1 設計模式

將乙個請求封裝為乙個物件,使發出請求的責任和執行請求的責任分割開。這樣兩者之間通過命令物件進行溝通,這樣方便將命令物件進行儲存、傳遞、呼叫、增加與管理。

專案中將http連線,資料庫連線作為物件,當有使用者連線時會建立相應的http連線物件並分配相應的定時器,對於非活動鏈結,由定時器完成物件的銷毀。

資料庫連線是事先建立好的物件,因為執行時建立資料庫連線訪問資料庫會很耗時,所以選擇事先建立好一些資料庫連線,需要訪問資料庫時再從資料庫連線池中取出物件。

利用資料庫連線池訪問資料庫、執行緒池完成伺服器的併發事件處理,和資料庫連線池一樣,執行緒池的目的是對執行緒的重複利用,使用預先建立好的一些執行緒,這樣就不會有建立執行緒的開銷了。

利用阻塞佇列完成日誌請求的處理,主線程往佇列中加入請求,佇列滿時主線程阻塞,工作執行緒從佇列中取出請求實體執行。

執行緒池、資料庫連線池都用到了單例模式,只提供乙個對外介面讓外界訪問。

2.1.2 部分介面api展示

執行緒池

1 threadpool(int actor_model, connection_pool *connpool, int thread_number = 8, int max_request = 10000

);2 ~threadpool();

3state);

4資料庫連線池

1 mysql *getconnection(); //

獲取連線

2bool releaseconnection(mysql *conn); //

釋放連線

3int getfreeconn(); //

獲取連線

4void destroypool(); //

所有連線56

7static connection_pool *getinstance();//單例模式獲取例項

8void init(string url, string user, string password, string databasename, int port, int maxconn, int close_log);

雙向鍊錶實現的計時器:

public

: sort_timer_lst();

~sort_timer_lst();

void add_timer(util_timer *timer);

void adjust_timer(util_timer *timer);

void del_timer(util_timer *timer);

void

tick();

private

:

void add_timer(util_timer *timer, util_timer *lst_head);

阻塞佇列:

1     block_queue(int max_size = 1000)2

78 m_max_size =max_size;

9 m_array = new

t[max_size];

10 m_size = 0

;11 m_front = -1

;12 m_back = -1;13

}1415void

clear()

1623

24 ~block_queue()

2532

//判斷佇列是否滿了

33bool

full()

3442

m_mutex.unlock();

43return

false;44

}45//判斷佇列是否為空

46bool

empty()

4754

m_mutex.unlock();

55return

false;56

}57//返回隊首元素

58bool front(t &value)

5966 value =m_array[m_front];

67m_mutex.unlock();

68return

true;69

}70//返回隊尾元素

71bool back(t &value)

7279 value =m_array[m_back];

80m_mutex.unlock();

81return

true

;82 }

3.1 分解檢視

3.2 依賴檢視

3.3 實現檢視

3.4 部署檢視

3.5 工作分配檢視

列名欄位名

字段說明

型別是否為空說明1

userid

使用者id

intn

2username

使用者名稱varchar(50)n3

userpassword

使用者密碼

varchar(100)y序號

欄位名字段說明

型別是否為空說明1

timer_flag

定時器標識

intn

2state

連線狀態

intn

序號欄位名

字段說明

型別是否為空說明1

user_data

使用者資料

textn2

expire

剩餘時間

varchar(50)n序號

欄位名字段說明

型別是否為空說明1

sourceid

資源id

intn

2sourcename

資源名varchar(50)n3

sourcetype

資源型別

inty

4sourcestatus

資源狀態

intn

序號欄位名

字段說明

型別是否為空說明1

logtype

日誌型別

varchar(50)n2

time

生成日期

varchar(50)

n開發語言:c++

開發環境:ubuntu20.04,mysql8.0.22

開發工具:gdb,vim,vscode

dhcp伺服器Linux系統

dhcp使用udp進行通訊,客戶端使用埠68,伺服器端使用埠69.dhcp工作原理 dhcp發現,dhcp提供,dhcp請求,dhcp確認。dhcp解約條件 1 客戶離線,重新登入,關閉網路介面,重新開機關機 2 客戶端租約到期,更新租約 租約50 時,傳送dhcp請求 單播 租約87.5 傳送dh...

更新Linux伺服器系統時間

rem copy right by ac del c temp.vbs echo onerror resume next c temp.vbs rem 建立臨時指令碼檔案 echo dimwshshell c temp.vbs echo setwshshell wscript.createobjec...

linux系統下搭建伺服器

linux系統下 可以搭建多種伺服器如 1 搭建dhcp伺服器 2 搭建dns伺服器 3 搭建web伺服器 4 搭建samba 和nfs伺服器 5 搭建ftp伺服器 下面主要介紹在linux系統下 centos 怎樣搭建samba 和nfs伺服器 搭建samba伺服器 主要用於windows使用者和...