上次提到,mongoose通過呼叫mg_start()啟動乙個master_thread執行緒,用於監聽所有的client連線請求。
在接到client請求後,主程序會通過呼叫accept_new_connection()去處理連線請求。
下面是accept_new_connection()的實現:
static voidaccept_new_connection()首先判斷連線,判斷是否為可用連線,然後呼叫put_socket()函式,put_socket()的主要作用是為新連線分配工作者執行緒的。accept_new_connection(const struct socket *listener, struct mg_context *ctx)
unlock_option(ctx, opt_acl);
…………
accepted.is_ssl = listener->is_ssl;
put_socket(ctx, &accepted);
}
實現**如下:
static voidput_socket()首先判斷佇列是否已經滿了,如果滿了,就等待直到有空餘位置再進行下一步操作。下一步,首先判斷是否有空閒程序並判斷執行緒數量是否已經到達最大值,如果沒有,啟動乙個新的工作者執行緒。put_socket(struct mg_context *ctx, const struct socket *sp)
pthread_cond_signal(&ctx->empty_cond);
(void) pthread_mutex_unlock(&ctx->thr_mutex);
}
這裡的工作者執行緒類似於主程序,只是他的作用是處理本使用者的請求的。在worker_thread中,它把client資訊從佇列中取出來,然後與client建立連線,然後呼叫process_new_connection()函式。
我讀Mongoose原始碼 程式框架
mongoose是一種web伺服器,因為最近在學習網路程式設計,所以打算研究研究它的原始碼,認真看了大部分,覺得學到的東西的確不少,拿出來分享一下,也和大家交流交流 剛開始,也是看作者的文章才產生興趣讀原始碼,所以分享很重要 o 如果想快速的閱讀原始碼,可以先預覽一下usermanual.md這個檔...
mina原始碼解析之 資料接收處理流程
如果想通過mina來實現乙個自定義協議的網路應用程式,使用者只需要編寫自定義協議編譯碼處理器和業務處理邏輯即可。由於每乙個session關聯乙個processor處理執行緒,多個session共享有限的processor執行緒池,如果handler中的業務邏輯處理比較耗時,會導致後續請求阻塞等待,嚴...
(原創)Dubbo原始碼之消費者接收響應
nettyhandler類中messagereceived方法 最終執行headerexchangehandler的received方法 判斷返回值是否為response如果是執行handleresponse方法 執行defaultfuture.received 執行 future.doreceiv...