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發...