Linux 多執行緒服務端程式設計讀書筆記(七)

2021-09-23 15:44:00 字數 2773 閱讀 6151

1、unp 中五個簡單的示例

discard:丟棄所有收到的資料,簡單的長連線tcp應用層協議

void discardserver::

onmessage

(const tcpconnectionptr& conn,

buffer* buf,

timestamp time)

daytime:短連線協議,在傳送完當前時間後,由伺服器主動斷開連線

void daytimeserver::

onconnection

(const tcpconnectionptr& conn)

}

time : 與daytime極其相似,只不過它返回的不是日期時間字串,而是乙個32bit的整數

void timeserver::

onconnection

(const muduo::net::tcpconnectionptr& conn)

}

time客戶端:time服務端傳送的是二進位制資料,不易讀取,因此客戶端來解析

void

onmessage

(const tcpconnectionptr& conn, buffer* buf, timestamp receivetime)

else}}

;

echo:前面的都是乙個單向接收和傳送資料,這是第乙個雙向傳送的協議,即將服務端傳送的資料原封不動的傳送回去

void echoserver::

onmessage

(const muduo::net::tcpconnectionptr& conn,

muduo::net::buffer* buf,

muduo::timestamp time)

chargen: 只傳送資料,不接受資料,且傳送資料的速度不能快過客戶端接收的速度

void chargenserver::

onconnection

(const tcpconnectionptr& conn)

}void chargenserver::

onmessage

(const tcpconnectionptr& conn,

buffer* buf,

timestamp time)

五合一

前面的五個程式都用到了evenloop,其實是乙個reactor,用於註冊和分發io事件

int

main()

這就是reactor模式復用執行緒的能力,讓乙個單執行緒程式同時具備多個網路服務功能

2、 檔案傳輸

​ 利用 onwritecomplete() 實現分段傳輸,做到不必一次全部讀入記憶體。

3、 tcp的半關閉問題

shutdown()沒有直接關閉tcp連線,這樣是為了收發資料的完整性

tcp是個全雙工協議,同乙個檔案描述符既可讀也可寫,shutdownwrite()關閉了「寫」方向上連線,保留了讀方向上的,這成為tcp的半關閉狀態,如果直接close, 那麼socket_fd就不能讀或者寫了

muduo把主動關閉連線的行為分兩步走,先關閉寫端,等對方關閉後,在關閉本地的讀端

muduo這種關閉連線要求對方read到0位元組後會主動關閉連線,當對方故意不關閉連線,muduo的連線就一直半開阿哲,消耗系統資源。必要時呼叫tcp::connection::handleclose()強行關閉連線

tcp正在關閉是在tcpconnection物件析構的時候,這裡會用到raii

4、tcp的分包問題

訊息長度固定

使用特殊字元或字串作為訊息邊界,如http中的heads以「\r\n"

在每條訊息頭部加乙個長度字段

利用訊息本身的格式分包,例如xml、json

5、muduo buffer類的設計與使用

為什麼非阻塞網路程式設計中應用層buffer是必須的

tcp粘包問題

網路庫在處理「socket可讀」事件的時候必須一次性把socket的資料一次性讀完(從作業系統的buff搬運到應用層的buff上面),否則會反覆觸發pollin事件,造成busy-loop.這是因為採用的是lt模式

buffer的設計

buffer的資料結構就是三個指標,乙個陣列,具體看書

buffer其他設計方案

6、一種自動反射訊息的protobuf網路傳輸方案,

​ 此部分具體看書

7、限**務器的最大併發連線數

​ 這裡的併發連線數是指同時支援的客戶端的連線數

不希望程式超載

因為fd是稀缺資源

8、定時器

與時間相關的常見任務

獲取當前時間,計算時間間隔

失去轉換與日期計算

定時操作

muduo使用的時間操作函式

計時:只使用 gettimeofday(2) 獲取當前時間

定時:只使用 timerfd_* 系列函式。

在非阻塞服務端程式設計中,絕對不能用 sleep() 或類似的辦法(這是因為該函式的實現可能用到了sigalm,與多執行緒水火不容,見讀書筆記4)來讓程式原地等待,這會讓主事件迴圈被掛起,程式失去響應。

測量兩台機器的網路延遲與時間差

9、用timing wheel (時間輪)踢掉空閒連線

10、 簡單的訊息廣播服務

​ 此後的內容具體看書

評 Linux多執行緒服務端程式設計

9.1分,尼瑪,坑誰呢。看這裡,比較客觀 muduo適用於什麼環境?muduo的官方一句話自我介紹是 a c non blocking multi threaded network library for linux。在其readme和wiki中均未提及此lib是否適用於實際場景,於是我花了些時間翻...

linux下多執行緒實現服務端

併發服務端有多執行緒的和多程序的,今天來看一下多執行緒的。執行緒程式設計可能會麻煩一點,其中涉及到一些同步,死鎖問題,但是也有其優點。併發服務端用的多的還是多程序。服務端 include include include include include include include include ...

linux網路程式設計 廣播服務端

解釋都在 裡 廣播接收服務端 include include include include include include include include define dbgprint printf define print printf define ip found ip found ip發...