麻豆成人91精品二区三区,国产91在线播放,加勒比无码专区中文字幕,欧美黑人XXXX高潮猛交

×

怎么實現(xiàn)一個網(wǎng)站的Web Server(下)

  • 作者:新網(wǎng)
  • 來源:新網(wǎng)
  • 瀏覽:100
  • 2018-02-24 17:42:01

怎么實現(xiàn)一個網(wǎng)站的Web Serve?Web服務(wù)器可以解析(handles)HTTP協(xié)議。當(dāng)Web服務(wù)器接收到一個HTTP請求(request),會返回一個HTTP響應(yīng)(response),例如送回一個HTML頁面。

 怎么實現(xiàn)一個網(wǎng)站的Web Serve?Web服務(wù)器可以解析(handles)HTTP協(xié)議。當(dāng)Web服務(wù)器接收到一個HTTP請求(request),會返回一個HTTP響應(yīng)(response),例如送回一個HTML頁面。

t01106c1687f82fb8e5.gif
定時器 Timer
 
如果一個請求在建立連接后遲遲沒有發(fā)送數(shù)據(jù),或者對方突然斷電,應(yīng)該如何處理?我們需要實現(xiàn)定時器來處理超時的請求。Vino 定時器的實現(xiàn)參考了 Nginx 的設(shè)計,Nginx 使用一顆紅黑樹來存儲各個定時事件,每次事件循環(huán)時從紅黑樹中不斷找出最小(早)的事件,如果超時則觸發(fā)超時處理。為了簡化實現(xiàn),在 Vino 中,我實現(xiàn)了一個小頂堆來存儲定時事件,如果被處理的定時事件同時支持長連接,那么在該請求處理完畢后會更新該請求對應(yīng)的定時器,也就是重新計時。定時器相關(guān)代碼見 vn_event_timer.h 和 vn_event_timer.c。
 
HTTP Parser
 
由于網(wǎng)絡(luò)的不確定性,我們并不能保證一次就能讀取所有的請求數(shù)據(jù)。因此,對于每一個請求,我們都會開辟一段緩沖區(qū)用于保存已經(jīng)讀取到的數(shù)據(jù)。同時,我們需要同時對讀取到的數(shù)據(jù)進行解析,以保證讀取到的數(shù)據(jù)都是合理的數(shù)據(jù),例如,假設(shè)目前緩沖區(qū)內(nèi)的數(shù)據(jù)為 GET /index.html HTT,那么下一次讀取到的字符必須為 P,否則,應(yīng)立即檢測出當(dāng)前請求是一個異常的請求,并主動關(guān)閉當(dāng)前的連接。
 
基于以上分析,我們需要實現(xiàn)一個 HTTP 狀態(tài)機(Parser)來維持當(dāng)前的解析狀態(tài),Vino 狀態(tài)機的實現(xiàn)參考了 Nginx 的設(shè)計,并對 Nginx 的實現(xiàn)做了簡化。HTTP Parser 相關(guān)代碼見 vn_http_parse.h 和 vn_http_parse.c。
 
Memory Pool
 
我們一般使用 malloc/calloc/free 來分配/釋放內(nèi)存,但是這些函數(shù)對于一些需要長時間運行的程序來說會有一些弊端。頻繁使用這些函數(shù)分配和釋放內(nèi)存,會導(dǎo)致內(nèi)存碎片,不容易讓系統(tǒng)直接回收內(nèi)存。典型的例子就是大并發(fā)頻繁分配和回收內(nèi)存,會導(dǎo)致進程的內(nèi)存產(chǎn)生碎片,并且不會立馬被系統(tǒng)回收。
 
使用內(nèi)存池分配內(nèi)存,可以在一定程度上提升內(nèi)存分配的效率,不需要每次都調(diào)用 malloc/calloc 函數(shù)。同時,使用內(nèi)存池使得內(nèi)存管理更加簡單。在 Vino 中,針對每一個請求,Vino 都會為其分配一或多個內(nèi)存池(各個內(nèi)存池形成一個單鏈表),在請求處理完畢后,一并釋放所有的內(nèi)存。
 
Vino 內(nèi)存池的實現(xiàn)依舊參考了 Nginx 的實現(xiàn),并做了簡化,Memory Pool 相關(guān)代碼見 vn_palloc.h 和 vn_palloc.c。
 
其他
 
在開發(fā) Vino 的過程中,還有許多需要考慮和權(quán)衡的地方。響應(yīng)請求時,如果用戶請求的是一個很大的文件,導(dǎo)致寫緩沖區(qū)滿,我們?nèi)绾胃玫脑O(shè)計響應(yīng)緩沖區(qū)?如何更高效的設(shè)計底層數(shù)據(jù)結(jié)構(gòu)(如字符串、鏈表、小頂堆等)?如何更優(yōu)雅的解析命令行參數(shù)?如何對特定信號進行處理?如何更健壯的處理錯誤信息?當(dāng)代碼的數(shù)量達到一定程度后,如何更快的定位異常代碼?
 
Vino 的開發(fā) & 重構(gòu)暫時告一段落,源碼放在了 GitHub 上。當(dāng)然,Vino 還有許多不足之處,以及未實現(xiàn)的特性。
 
僅支持 HTTP GET 方法,暫不支持其他 HTTP method。
 
暫不支持動態(tài)請求的處理。
 
支持的 HTTP/1.1 特性有限。
 
以上就是小編對于怎么實現(xiàn)一個網(wǎng)站的Web Serve的全部解答。
 

免責(zé)聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻自行上傳,本網(wǎng)站不擁有所有權(quán),也不承認相關(guān)法律責(zé)任。如果您發(fā)現(xiàn)本社區(qū)中有涉嫌抄襲的內(nèi)容,請發(fā)送郵件至:operations@xinnet.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,本站將立刻刪除涉嫌侵權(quán)內(nèi)容。

免費咨詢獲取折扣

Loading
无码AV中文一区二区三区| 韩日在线三级片| t66y最新地址一地址二地址三| 尤物AⅤ在线免费| 永久免费黄色网站| 毛片一区二区无码视频| 奶水丰满人妻HD| 国产女同99| 欧美熟女色图| 久久久久亚洲A| 亚洲熟妇X X X| 亚洲AV成人WWW永久无码精品| 奇米久久免费视频| 亚洲免费视频| 久久國際精品| 开心色色色四房播播| 99久久精品无码一区二区| 天天午夜精品| 激情内射| 国产免费成人黄片| 国产精品性爱在线| 麻豆aⅴ精品无码一区二区| A类片免费观看| 国产免费观看a大片的网站| 成伊人| 国产精品国产精品国产专区不粉h| 无码窝999| 回久18久久久久| 另类亚洲av| 欧美性黄膜| 国产美女牲交视频| 日韩开心网| 无码在线不卡| 亚洲AV一道| 不卡无在线一区| 亚洲AV一二三四| 欧美中文亚洲专区| 一级久久| 啊啊啊啊亚洲无码| 玖玖玖午夜日韩精品| 小舞屈辱打开双腿自慰出白浆 |