mongoose是一種web伺服器,因為最近在學習網路程式設計,所以打算研究研究它的原始碼,認真看了大部分,覺得學到的東西的確不少,拿出來分享一下,也和大家交流交流
剛開始,也是看作者的文章才產生興趣讀原始碼,所以分享很重要(^o^)
如果想快速的閱讀原始碼,可以先預覽一下usermanual.md這個檔案,使用者手冊告訴我們怎麼去使用這個伺服器,以及如何使用它提供的功能。
程式的框架:
mongoose採用的是執行緒池模型,有兩個關鍵的資料結構,mg_callbacks和mg_context,前者是一系列函式指標集合,在程式的執行過程中我們會呼叫這些函式,後者則是mongoose的核心,資料結構後面單獨分析,回到程式框架上來
[cpp]view plain
copy
main()
程式的開始:
程式開始於mg_start,結束於mg_stop,在mg_start()中,分別生成主線程和工作執行緒,工作執行緒我們可以自己配置,預設是50個
mg_start_thread(master_thread,ctx)
mg_start_thread(worker_thread,ctx)
然後分為兩條線路:
1. master_thread()中採用poll來處理監聽套接字,對於每乙個監聽套接字,當有新的連線請求時,呼叫accept_new_connection()處理新的連線。accept_new_connection()中呼叫produce_socket()產生新的連線套接字,產生的連線套接字放入執行緒池佇列中,因為是多執行緒,所以要考慮執行緒同步問題,這裡採用了「生產者---消費者」模型,很好的處理了同步問題
2. worker_thread()中作為消費者,我們呼叫consume_socket(),然後呼叫process_new_connection()來處理新的連線,實質是呼叫handle_request()函式,至此整個程式的框架一目了然
程式的結束:
我們在main函式中sleep了,當我們收到了訊號例如鍵盤上的ctrl+c,
static voidwincdecl signal_handler(int sig_num)
}
修改了mg->stop_flag = 1,然後等待其變為2, 其實就是去清理執行緒資料,我們在master_thread()中看到最後一句ctx->stop_flag = 2,至此,程式就退出了,以上就是程式的結束流程。
程式的框架圖大體是這樣的:
Mongoose原始碼之接收連線
上次提到,mongoose通過呼叫mg start 啟動乙個master thread執行緒,用於監聽所有的client連線請求。在接到client請求後,主程序會通過呼叫accept new connection 去處理連線請求。下面是accept new connection 的實現 stati...
我是如何讀原始碼的
今天有小夥伴群裡問我該如何讀原始碼,問題和解答如下,希望對大家有幫助 問題 那如何正確的看原始碼,最近想看redis,不知道從哪方面下手。回答 你首先要知道你要看的原始碼做了什麼,是你的話該如何做,帶著這種思考再去看,從頂層的設計開始,摸清整體節奏,也就拿到了骨架,然後再豐富細節,也就是 細節。我自...
談談我讀原始碼的心得
其次,我想說,當發現讀 用到的核心演算法自己不懂。這時,我想,再硬著頭皮讀,意義不大,還不如先把核心演算法搞明白再說。比如,讀gem algorithms時,遇到紅黑樹,我就先去翻演算法導論,去找這個演算法。再去啃 總之,一定不要害怕讀原始碼,先要樹立信心,別人是乙個腦袋,我也是乙個腦袋。別人能寫出...