日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

基于epoll+threadpool的webServer分析与实现

發布時間:2023/11/30 编程问答 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于epoll+threadpool的webServer分析与实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

該webServer使用epoll+threadpool實現,支持GET、POST方法,并添加CGI進行數據計算并返回網頁信息,可以解析返回html、picture、mp3、js、css等文件,可以實現穩定的運行。 使用c++編寫。

源碼請看我的Github。

流程簡述

  • 啟動服務器,在瀏覽器輸入服務器地址,將向服務器發送HTTP請求

  • 服務器接收數據,新建任務,將任務添加到任務隊列

  • 從線程池中喚醒某線程,執行任務。若沒有任務線程會處于wait狀態;若任務過多,會存儲在任務隊列中,等待空閑線程來執行

  • 某線程獲得任務后,讀取瀏覽器發送的請求信息,進行解析HTTP首部,根據對應的結果來進行相應的處理,返回信息,若文件不存在則返回404.html,若請求方法不存在則返回501錯誤信息。

  • 若是POST,則需要調用CGI進行處理,并返回相應的信息。

  • 任務結束后,需要進行delete,因為在主進程中,為避免任務未運行完便被析構,需要使用new來新建對象,為避免內存泄露,需要在任務結束后使用delete釋放資源。雖然這樣使得new 與 delete分離,但是可以保證程序的正常運行。

  • 線程池結束后,需要喚醒阻塞中的所有線程,以使其正常退出。

具體實現細節

  • 由于在實現線程池時,需要用到任務隊列,為保證任務隊列在添加、刪除元素時不會出錯,需要對其加鎖;同樣由于在線程池中線程的運行與否需要受到控制,因此需要使用條件變量來使線程保持同步。所以在locker.h中定義了兩個類:互斥鎖、條件變量。互斥鎖比較簡單,所以說一下條件變量需要注意的細節:

    • 條件變量需要與互斥鎖配合使用。由于條件變量的操作并非原子操作,因此在進行相關變量狀態轉變的時候,多線程若操作統一條件變量會造成錯誤。因此在條件變量之前需要加互斥鎖進行保護,結束后及時解鎖。
  • 由于每次接收到數據時,需要新建一個任務,因此在task.h中定義一個封裝任務信息的類。該類負責接受來自瀏覽器具體的請求信息,再進行解析,根據對應的結果進行處理與返回網頁信息等。

    • 由于在任務結束后會調用delete,從而會進行析構,因此可以在Task的析構函數中關閉連接。即每個任務(每個HTTP請求)對應一個線程,每次任務結束后都會關閉與瀏覽器連接。
    • 在每次任務執行時,為避免讀取數據出錯,需要循環讀取,直到對方關閉連接(recv返回值=0)或請求處理完成后退出循環,即一次任務完成后也要退出循環。PS:一定要注意關閉連接的時間,否則瀏覽器會一直處于pending狀態
  • threadPool.h存放線程池的定義與實現。線程池提供線程的調度,及時處理任務隊列中的任務;若任務隊列為空,則所有線程處于阻塞狀態。由于使用模板類,因此需要將類定義與方法實現放在一個文件夾下,因為模板類的成員函數不能單獨編譯。詳見我的另一篇博客:線程池的分析與實現。

  • webServer.h與webServer.cpp存放WebServer類的定義與實現。該類主要進行socket的創建,綁定,監聽,與accept,使用epoll實現。在接收到新連接時,將fd注冊到內核事件表;有數據寫入時,便使用new新建任務,并添加到線程池。由于任務使用new創建,因此任務結束后需要及時delete task。

使用介紹

  • 由于在上傳時,將mp3文件刪除(上傳緩慢),因此需要在與index.html同級的目錄下放一個mp3文件,并命名為1.mp3。

  • 打開終端,在makefile目錄下,輸入./server port以運行服務器,其中port為端口號,以下以8080端口為例:
    終端輸入 :

./server 8080

打開瀏覽器,在網址輸入:

localhost:8080

或輸入網址:

127.0.0.1:8080

即可連接服務器。

  • 如果要使用自己的網頁,只要將網頁放到與webServer.cpp統一目錄下,把index.html用新的主頁覆蓋即可。

參考:《Linux高性能服務器編程》

總結

以上是生活随笔為你收集整理的基于epoll+threadpool的webServer分析与实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。