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)23.1 分解檢視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.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使用者和...