Mongoose原始碼之接收連線

2021-06-06 07:14:20 字數 976 閱讀 2490

上次提到,mongoose通過呼叫mg_start()啟動乙個master_thread執行緒,用於監聽所有的client連線請求。

在接到client請求後,主程序會通過呼叫accept_new_connection()去處理連線請求。

下面是accept_new_connection()的實現:

static void

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);

}

accept_new_connection()首先判斷連線,判斷是否為可用連線,然後呼叫put_socket()函式,put_socket()的主要作用是為新連線分配工作者執行緒的。

實現**如下:

static void

put_socket(struct mg_context *ctx, const struct socket *sp)

pthread_cond_signal(&ctx->empty_cond);

(void) pthread_mutex_unlock(&ctx->thr_mutex);

}

put_socket()首先判斷佇列是否已經滿了,如果滿了,就等待直到有空餘位置再進行下一步操作。下一步,首先判斷是否有空閒程序並判斷執行緒數量是否已經到達最大值,如果沒有,啟動乙個新的工作者執行緒。

這裡的工作者執行緒類似於主程序,只是他的作用是處理本使用者的請求的。在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...